0

我已经做到了这一点,但如果我做得对,我会问更多。我一直沉浸在苹果文档和iOS编程书籍中。从那以后,我完全重新设计了我的应用程序以实现可重用性和所有这些好东西。

现在我有一个名为 RootController 的主 UIViewController 来处理 UINavigationController 和自定义 MenuController。我认为 UIViewController 包含是我的 RootController 的最佳方法。

RootController ---> UINavigationController
               ---> MenuController

现在出现了一个问题,我需要 UINavigationController 中的一些子 UIViewController 与主 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

当 [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 回答