要するに、ビュー A とビュー B を切り替えることができる 2 つのフルスクリーン ビューが必要です。内部で何が起こっているのかを知るために、これがどのように手作業で行われるかを知りたいです。
ルートコントローラーとして機能する UIViewController があります。
@interface MyRootController : UIViewController {
IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;
@end
contentView は、Nib の「ビュー」にサブビューとして追加した UIView に接続されています。これは緑色で、フルスクリーンで表示されます。正常に動作します。
次に、ほとんど同じ方法で、別の 2 つのビュー コントローラーを作成しました。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 からのビューが表示されます。しかし今、大きな問題は次のとおりです。View Controller には通常、次のようなすべてのメソッドがあります。
- (void)viewWillAppear:(BOOL)アニメーション;
- (void)viewDidDisappear:(BOOL)アニメーション;
- (void)viewDidLoad;
...等々。タブバーコントローラーなしで「自分の」方法で実行すると、誰が、何を、またはどのようにそれらのメソッドが呼び出されるのでしょうか? つまり、その ViewController のクラスを割り当ててビューが表示される場合、それらのメソッドの呼び出しに注意する必要がありますか? viewWillAppear、viewDidDisappear、または viewDidLoad をどのように認識しますか? Tab Bar Controller には、このような「賢さ」がすべて備わっていると思います。それとも私が間違っていますか?
更新: 私はそれをテストしました。ビュー コントローラ (例: ViewControllerA) を解放すると、viewDidDisappear にログ メッセージが表示されません。ViewControllerA を割り当てて初期化するときにのみ、viewDidLoad を取得します。しかし、それだけです。したがって、すべての兆候は現在、UITabBarController の巧妙さを表しています ;) そして、それを複製する方法を見つけなければなりませんよね?