私は3つのストーリーボードで作業しており、コードのセクションでViewControllerの識別子を取得していますが、どのストーリーボードがそれに属しているかわからないため、instantiateViewControllerWithIdentifierを呼び出すことはできません。
問題は、ViewController 識別子を使用して StoryBoard インスタンス/識別子を取得することは可能ですか?
よろしくお願いします!
私は3つのストーリーボードで作業しており、コードのセクションでViewControllerの識別子を取得していますが、どのストーリーボードがそれに属しているかわからないため、instantiateViewControllerWithIdentifierを呼び出すことはできません。
問題は、ViewController 識別子を使用して StoryBoard インスタンス/識別子を取得することは可能ですか?
よろしくお願いします!
instantiateViewControllerWithIdentifier を呼び出すことはできますが、その識別子を持つビュー コントローラーが存在しない場合は nil 値が返されます。
nil 以外の値が見つかるまで、3 つのストーリーボードでこの方法をテストできます。
Apple のドキュメントを参照してください
編集:例外を検出した後(申し訳ありませんが、Appleのドキュメントは時々少し混乱します)、できることは、このようなtry/catchブロックでコードをラップすることです
@try {
UIViewController *myViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewControllerID"];
}
@catch (NSException *exception) {
DLog(@"Exception: This is not the storyboard");
}
@finally {
DLog(@"I found it!");
}
私は自分のアプリで同様の問題を何日も調査しました。私の知る限り、ストーリーボードに特定のビューコントローラー ID が含まれているかどうかを確認することはできません。Apple のドキュメントでは、これを事前に知っておく必要があり、id が見つからない場合は、すぐに例外が発生します。
try-catch ブロックの使用に関する提案を見てきました。ただし、それらをいじってみると、非常に薄い氷を踏んでいることがわかりました。テストするストーリーボードが複数ある場合、IMO はすぐに非常に複雑になります。
私が自分のアプリで採用したアプローチの 1 つは、ViewController の名前付けスキームを考え出すことです。これには、基本的にそれが属するストーリーボードの情報が含まれます。たとえば、ストーリーボード 1 のすべてのビューコントローラーは「1-...」で始まります。次に、文字列関数を介してコードでこれを抽出し、その場で正しいストーリーボードをインスタンス化できます。