私はこれを達成しましたが、これを正しく行ったかどうかをさらに尋ねています。私はアップルのドキュメントと 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 を処理できるように、メインのルート コントローラーにアクセスする必要があります。