2

私のアプリでは、ナビゲーションコントローラーで表示する必要のあるモーダルビューがたくさんあるので、次のような多くのことを行うことになります。

MyModalController *modal = [[MyModalController alloc] init];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:modal];
[modal release];

[self presentModalViewController:navCon];
[navCon release];

理想的には、これを単純化して、MyModalControllerがナビゲーションコントローラーの作成を処理するようにします。この種のもののベストプラクティスはありますか?いつでものようなメソッドを追加できる+navigationControllerWithModalControllerと思いますが、他の人のやり方を聞きたいです。

また、デリゲートをMyModalControllerにアタッチできるようにしたいので、現在のView Controllerに情報を送り返すことができるので、いつ閉じるかがわかります。

4

1 に答える 1

0

では、それぞれのビューを固有のナビゲーション コントローラーで表示する必要があるのでしょうか? 次に、計画を少し逆にして、次のように記述します。

@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];

デリゲート プロパティを持たないものでナビゲーション コントローラーをインスタンス化しようとすると、例外が発生します。

于 2011-09-01T18:57:35.967 に答える