检查已知的UIViewcontroller引用

时间:2014-07-04 11:52:40

标签: ios objective-c uiviewcontroller casting

我有一个基于故事板的应用程序。在故事板中我定义了一个模态segue,其中包含一个包含UVviewController的UINavigationController。在prepareForSegue方法期间,代码为:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = [segue destinationViewController];
    if ([destinationViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navController = (UINavigationController *)destinationViewController;
        UIViewController *topController = navController.topViewController;
        if ([topController isMemberOfClass:[FilterBaseViewController class]]) {
            FilterBaseViewController *filterController = (FilterBaseViewController *)topController;
            filterController.dismissalDelegate = self;
        }
    }
}

如上所示,我做了很多检查,以确保我可以访问的每个控制器实际上我正在寻找的控制器。但是我的代码变得冗长。知道我的故事板的布局我不能只说:

UIViewController * topController = ((UINavigationController *)destinationViewController).topViewController;
((FilterBaseViewController *)topController).dismissalDelegate = self;

知道我的演员表是正确的并且我得到的实例属于所需的类吗?是否确实需要所有以前的检查?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您将多个segue表单添加到另一个控制器,您将收到崩溃。如果我是你,我会检查segue标识符。检查类类型是没用的。

NSString *identifier = segue.identifier;
if ([identifier isEqualToString:@"Edit"]) {
    UIViewController * topController = ((UINavigationController *)destinationViewController).topViewController;
    ((FilterBaseViewController *)topController).dismissalDelegate = self;
}