视图控制器:如何以编程方式在视图之间切换?

简而言之:我想拥有两个全屏视图,可以在视图A和视图B之间切换。我知道我可以只使用Tab Bar Controller,但我不想这样做。我想看看这是如何手工完成的,以了解引擎盖下的情况。


我有一个UIViewController充当根控制器:


@interface MyRootController : UIViewController {

    IBOutlet UIView *contentView;

}

@property(nonatomic, retain) UIView *contentView;


@end

contentView连接到一个UIView,我将它作为子视图添加到Nib的“视图”中。这是绿色,我全屏显示。工作正常。


然后,我几乎以相同的方式创建了另外两个视图控制器。ViewControllerA和ViewControllerB。ViewControllerA具有蓝色背景,ViewControllerB具有黑色背景。只是看看哪个活跃。


因此,在myRootController的实现中,我这样做:


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {

    [super viewDidLoad];


    ViewControllerA *vcA = [[ViewControllerA alloc] initWithNib];

    [self.contentView addSubview:vcA.view];


    [cvA release];

}

顺便说一句,-initWithNib方法看起来像这样:


- (id)initWithNib { // Load the view nib

    if (self = [super initWithNibName:@"ViewA" bundle:nil]) {

        // do ivar initialization here, if needed

    }

    return self;

}

这样可行。启动应用程序时,我从ViewControllerA中看到了视图。但是现在最大的问题是:视图控制器通常具有所有这些方法,例如:


(void)viewWillAppear:(BOOL)动画;

(void)viewDidDisappear:(BOOL)动画;

(void)viewDidLoad;

...等等。谁或什么,或者如果我没有选项卡栏控制器就以“我”的方式调用这些方法,该如何调用?我的意思是:如果我分配了ViewController的类,并且视图可见,那么我是否必须注意调用这些方法?它怎么知道viewWillAppear,viewDidDisappear或viewDidLoad?我相信Tab Bar Controller在引擎盖下具有所有这些“聪明”。还是我错了?


更新:我已经测试过了。如果释放视图控制器(例如:ViewControllerA),则在viewDidDisappear上不会收到任何日志消息。仅在分配和初始化ViewControllerA时,我才获得viewDidLoad。就是这样。因此,所有迹象现在都代表UITabBarController的聪明;),我必须弄清楚如何复制它,对吗?


RISEBY
浏览 465回答 3
3回答

白板的微信

如果我理解正确,那么您要完成的工作非常简单。只需在您的应用程序委托上添加一个UINavigationController并执行:[navigationController pushView:vcA];代表将被相应地召集:(void)viewWillAppear:(BOOL)动画;(void)viewDidDisappear:(BOOL)动画;(void)viewDidLoad;当您要弹出视图并推入另一个视图时:[navigationController popViewControllerAnimated:true];[navigationController pushView:vcB];如果您不希望显示navigationController,请使用:[navigationBar setHidden:YES];其中navigationBar是与您的UINavigationController对应的UINavigationBar。
打开App,查看更多内容
随时随地看视频慕课网APP