0

私はこれを達成しましたが、これを正しく行ったかどうかをさらに尋ねています。私はアップルのドキュメントと iOS プログラミングの本に没頭してきました。それ以来、再利用性とすべての優れた機能のために、アプリを完全に作り直しました。

これで、UINavigationController とカスタム MenuController を処理する RootController という名前のメイン UIViewController ができました。私は、UIViewController コンテインメントが私の RootController にとって最良のアプローチであると判断しました。

RootController ---> UINavigationController
               ---> MenuController

ここで、メインの RootController と通信するために UINavigationController のサブ UIViewControllers のいくつかが必要な場所で問題が発生しました。

RootController ---> UINavigationController --> UIViewController
       ^_____________________________________________|

私がやろうと決めたのは、 UIViewController をカテゴリで拡張することでした。

UIViewController+RootController.h

@interface UIViewController (RootController)

@property (nonatomic, readonly) RootController *rootController;

@end

UIViewController+RootController.m

@implementation UIViewController (RootController)

- (RootController *)rootController {
    static RootController *rootControler;
    if(rootControler == nil) {
        UIViewController *vc = self;
        while((vc = vc.parentViewController)) {
            if([vc isMemberOfClass:[RootController class]]){
                rootControler = (RootController *)vc;
                break;
            }
        }
    }
    return rootControler;
}

@end

[self rootController] が任意の UIViewController によって呼び出されると、RootController と一致するものが見つかるまで親ビュー コントローラーをループし、一致したものを返します。また、プロパティを静的にして、一度だけ検索されるようにしました。

だから私の質問は、これが私が行った正しいアプローチでしたか? UIViewController の navigationController メソッドに似たものを作ろうとしていました。

アプリ内の任意のビューから MenuController を処理できるように、メインのルート コントローラーにアクセスする必要があります。

4

1 に答える 1

1

あなたの解決策は正しいようですが、それほどきれいではありません。同様の状況で、私は通常、AppDelegate を使用して「逆」メソッドで参照を取得することを好みます。

例えば:

#import "AppDelegate.h" // at the top of your file

UIViewController *vc = [[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] rootViewController]:

vc は、ルート ビュー コントローラーへの参照です。ウィンドウのルート ビュー コントローラーは変更される可能性があるため、注意してください (変更した場合:-)。したがって、この場合、アプローチを変更する必要があります (たとえば、@property を AppDelegate に追加し、RootController がロード時にこのプロパティを設定するようにします)。

于 2012-12-10T17:13:26.440 に答える