无论对根容器有多少级别的深层访问权限,都会提供所有子视图控制器

时间:2012-12-10 16:59:10

标签: objective-c objective-c-category

我已经实现了这个目标,但如果我做得对,我会问更多。我一直沉浸在苹果文档和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。

1 个答案:

答案 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在加载时设置此属性)