16

私のコードにはこの行がありますが、「 instantiateViewControllerWithIdentifier 」メソッドで使用する前に@"SomeController"が存在するかどうかを確認する方法があるかどうか疑問に思っていました。識別子が存在しない場合、アプリはクラッシュします。

良い方法がなくても大きな問題にはなりません。識別子の名前に手を出さないようにもう少し注意することはできますが、もっとうまく扱えるようになることを望んでいました。

UIViewController *newTopViewController = [self.storyboard    instantiateViewControllerWithIdentifier:@"SomeController"];
4

6 に答える 6

7

Sで使えvalueForKey:ますUIStoryboardUIStoryboards には「identifierToNibNameMap」というキーがあり、その値はそのストーリーボードNSDictionaryUIViewControllers です。このインナーNSDictionaryはビューコントローラーの名前をキーとして使用するため、次のコードを使用してビューコントローラーがストーリーボードに存在するかどうかを実際に確認できます。

if ([[storyboard valueForKey:@"identifierToNibNameMap"] objectForKey:myViewControllerName]) {
    // the view controller exists, instantiate it here
    UIViewController* myViewController = [storyboard instantiateViewControllerWithIdentifier:myViewControllerName];
} else {
    //the view controller doesn't exist, do fallback here
}

注: Apple は、valueForKey:. これらの基本的なプロパティは、将来いつでも変更される可能性があり、警告なしにアプリの機能が損なわれる可能性があります。これらのものには非推奨プロセスはありません。

于 2016-01-07T08:34:33.800 に答える
3

いいえ、チェックはありません。ただし、その必要はありません。nilこのメソッドは、識別子が存在しない場合に返されるため、 NSAssert.

EDIT実際にはこれは間違っています!! それは奇妙です...ドキュメントの戻り値のセクションは別の部分と矛盾しています...しかし、それでも答えは最終的にノーです(識別子の存在を確認する方法はありません)

于 2012-11-20T02:23:25.130 に答える
1

コードを try-catch 例外処理でラップし、そのような例外が発生した場合の対応方法を決定できます。このメソッドを使用して、View Controller が Storyboard または nib ファイルで表されているかどうかを知らなくても、View Controller を動的にインスタンス化します。

于 2012-12-31T22:06:59.450 に答える