Cocoaが初めてなので、Interface Builder
、UIViewController
、および友人といくつかの問題があります。
XibでUIViewController
が定義されたUIView
サブクラスと、ビューに接続されたコントローラーのビューアウトレットがあります。 xibの「ファイルの所有者」は、myViewcontrollerサブクラスとして設定されます。
この1つのインスタンスでは、コントローラー/ビューを(メインビューコントローラーから)ロードする次のコードは期待どおりに機能しません。
if ( self.myViewController == nil )
{
self.myViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:nil];
}
[self.navigationController
pushViewController:self.myViewController animated:YES];
MyViewControllerのメソッドに、ブレークポイントとログメッセージを配置して、何が起こっているのかを確認しました。
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"initWithNibName\n");
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad\n");
}
期待される結果
-initWithNibName
メソッドと-viewDidLoad
メソッドの両方が呼び出され、myViewControllerのビューが表示されます。
観測結果
-initWithNibName
のみが呼び出され、ビューは表示されません。
私は何かを見逃しましたか?誰でもチェックすることをお勧めできますか? (特に、驚くほど不透明なInterface Builderツール)。
OK問題は:
[self.navigationController pushViewController:myViewController animated:YES];
よく見ると、この場合はself.navigationController
はnilです-プッシュメッセージはどこにも行きません。
代わりに、私が送信する場合:
[self.view addSubview:self.myViewController.view];
次に、ビューが表示され、-viewDidLoad
が呼び出されます。
なぜself.navigationController
はこのインスタンスでは設定されません-考えられる唯一のことは、self
がUIViewController
ではなくUITableViewController
のサブクラスであるということです(ここで、pushViewController
コードの由来)。
また、メッセージを静かにnilに送信することを許可するのは悪い考えのように思えますが、 これらの回答 は別の言い方をします。私の質問も参照してください here 。
最終編集:
以下のコメントの答え、私が実際に求めていた表示機能は次のとおりです(myViewControllerがモーダルである場合)。
[self presentModalViewController:myViewController animated:YES];
有益な回答をありがとう。
RE:ソリューションが見つかりました!!!!!
確かにそれは実用的なソリューションのようですが、本当のトリックはview.hidden
プロパティをNOに設定することではなく、nibファイルからビューをロードするのはUIViewController's
viewメソッドの呼び出しです。 viewメソッドが初めて呼び出されたときにのみ、実際にビューはnibからロードされます。
その意味で、単純な[viewController view]
メッセージは、nibファイルからビューを強制的にロードします。
ソリューションが見つかりました!!!!!
これによりviewDidLoad
メソッドの呼び出しが発生するほど無害なものですらあります。
Alloc initWithNibName
の直後にこれを挿入します
viewController.view.hidden = NO; //calls viewDidLoad
_main.storyboard
_の_Identity Inspector
_にある想定されるViewController
を、作成したカスタムclass
にリンクしていない可能性があります。セグエを介して他のView Controllerからそのコントローラーにナビゲートできるかもしれませんが、viewDidLoad()
、viewWillAppear()
などのいずれも実行されません。
単に使用する
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//Your Code here
}
viewDidLoadメソッドの代わりに。
file's Owner(viewControllerサブクラス)のビューアウトレットが実際のビュー(つまり、UIの構築に使用する画面に表示される480X320キャンバス)に接続されていることを確認してください
振り返ってみると、もう少し明白な別の理由:if viewController.view
がコードで設定されている場合、viewDidLoadイベントはトリガーされません。
私には大文字の問題のように見えます。 pushViewControllerの呼び出しで、プロパティMyViewController
の代わりにクラスmyViewController
を参照しています。
実行ログでエラーを確認してください。ほぼ確実に、NIBはロードされておらず、その結果にエラーがあるはずです。その原因として最も可能性が高いのは、バンドルに入れられなかったことです。 「リソースのコピー」ビルドフェーズを見て、XIBが実際にコピーされていることを確認します。シミュレータ用にビルドし、ビルドディレクトリに移動して、NIBが.appバンドルに含まれていることを確認します。