我已经实现了这个目标,但如果我做得对,我会问更多。我一直沉浸在苹果文档和iOS编程书籍中。从那以后,我完全重写了我的应用程序的可重用性和所有好东西。
现在我有一个名为RootController的主UIViewController,它处理UINavigationController和一个自定义的MenuController。我认为UIViewController包含是我的RootController的最佳方法。
RootController ---> UINavigationController
---> MenuController
现在出现了一个问题,我需要UINavigationController中的一些子UIViewControllers与主RootController进行通信。
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
当任何UIViewController调用[self rootController]时,它将遍历父视图控制器,直到找到与RootController匹配的控制器,然后它将返回匹配。我还将该属性设置为静态,因此只查找了一次。
所以我的问题是这是我做出的正确方法吗?我试图做一些类似于UIViewController的navigationController方法。
我需要访问主根控制器,以便我可以从我的应用程序中的任何视图处理MenuController。
答案 0 :(得分:1)
您的解决方案似乎正确但不是那么干净。 在类似的情况下,我通常更喜欢使用AppDelegate在“逆”方法中获得引用。
例如:
#import "AppDelegate.h" // at the top of your file
UIViewController *vc = [[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] rootViewController]:
vc是对根视图控制器的引用。 请注意,因为窗口的根视图控制器可以更改(如果您更改它:-)。因此,在这种情况下,您应该更改您的aproach(例如,将@property添加到您的AppDelegate并使您的RootController在加载时设置此属性)