简而言之:我想要两个全屏视图,我可以在视图 A 和视图 B 之间切换。我知道我可以只使用选项卡栏控制器,但我不想。我想看看这是如何手工完成的,以了解幕后发生的事情。
我有一个 UIViewController 作为根控制器:
@interface MyRootController : UIViewController {
IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;
@end
contentView 连接到我作为子视图添加到 Nib 的“视图”的 UIView。这有绿色,我看到它全屏。工作正常。
然后,我以几乎相同的方式创建了另外两个视图控制器。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 的类并且视图 get 是可见的,我是否需要注意调用这些方法?它如何知道 viewWillAppear、viewDidDisappear 或 viewDidLoad?我相信标签栏控制器在引擎盖下具有所有这些“聪明”。还是我错了?
更新:我已经测试过了。如果我释放视图控制器(例如:ViewControllerA),我将不会在 viewDidDisappear 上收到任何日志消息。只有在分配和初始化 ViewControllerA 时,我才会得到一个 viewDidLoad。但就是这样。所以现在所有的迹象都代表了 UITabBarController 的聪明;)我必须弄清楚如何复制它,对吧?