では、それぞれのビューを固有のナビゲーション コントローラーで表示する必要があるのでしょうか? 次に、計画を少し逆にして、次のように記述します。
@interface UINavigationController (NavigationControllerWithViewController)
+ navigationControllerWithRootViewControllerOfType:(Class)type;
@end
/* ... */
@implementation UINavigationController (NavigationControllerWithViewController)
+ navigationControllerWithRootViewControllerOfType:(Class)type
{
UIViewController *modal = [[type alloc] init];
UINavigationController *navCon = [[UINavigationController alloc]
initWithRootViewController:modal];
[modal release];
return [navCon autorelease];
}
@end
これUINavigationController
で、View Controller のインスタンス化、関連する Navigation Controller の作成、および戻り値の共通処理を実行するカテゴリ on (つまり、クラスをサブクラス化したり、元のソースにアクセスしたりせずにクラスに新しいメソッドを追加する方法)が宣言されました。それ。その後、次のことができます。
UINavigationController *controller =
[UINavigationController navigationControllerWithRootViewControllerOfType:
[MyModalController class]];
[self presentModalViewController:controller];
または、代わりに必要なタイプのView Controllerを渡しますMyModalController
。ではないクラスを渡すとUIViewController
、ビューコントローラーではないものをUINavigationController -initWithRootViewController:
メソッドに渡すことになるので注意してください。
デリゲートに関しては、プロトコルとデリゲートの通常の宣言を行ってから、ナビゲーション コントローラーのカテゴリ メソッドにパラメーターを追加してデリゲートを提供すると思います。役に立つコンパイル時警告と役に立たないコンパイル時の警告の両方が失われますが、おそらく次のようにしたいと思うでしょう:
[(id)modal setDelegate:delegate];
デリゲート プロパティを持たないものでナビゲーション コントローラーをインスタンス化しようとすると、例外が発生します。