在包含另一个视图的导航控制器中,使用segue设置属性

34

当我试图在我的segue中设置一个属性时,出现了崩溃。这是一个UIView将一个属性传递给具有TableView作为根视图的导航控制器。它应该前往我的TableViewController,但看起来被那个导航控制器拦截并抛出了一个未识别选择器错误。

Segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showItems"]) {
        ShowItemsTableViewController *destinationViewController = [segue destinationViewController];

        [destinationViewController setItems:[self itemsFromCoreData]];
    }
}

错误:

- [UINavigationController setItems:]:向实例0x10920c840发送的未识别的选择器

这是怎么回事?该NavigationController没有与其关联的类,它只在storyboard中出现并以模态方式出现。如果我将storyboard中的segue设置为直接进入视图而不是NavigationController,则可以正常工作,但我确实需要nav。我该如何解决这个问题?

4个回答

75

由于目标视图控制器实际上是导航控制器,因此请尝试像这样访问根视图:

UINavigationController *navController = [segue destinationViewController];
ShowItemsTableViewController *SITViewController = (ShowItemsTableViewController *)([navController viewControllers][0]);
[SITViewController setItems:[self itemsFromCoreData]];

1
我猜标签栏控制器也会类似,谢谢帮忙。 - user2529626
我发现有时候人们会得到正确的VC,有时候却不会。非常奇怪。是否有某种配置可以告诉应用程序获取最终目标视图控制器? - mikebz
1
你也可以使用 [navController topViewController]。 - Labokas
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mezulu
3
在 Swift 中:segue.destinationViewController.topViewController - Kevin Qi
如果您经常这样做,并且希望将代码与故事板更改解耦,您可能希望在UIStoryboardSegue上添加一个类别方法,以确定destinationViewController是否为UINavigationController,如果是,则返回其topViewController,否则直接返回它。 - Benjohn

8

对于Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "segueShowNavigation" {
        var DestViewController = segue.destinationViewController as! UINavigationController
        let targetController = DestViewController.topViewController as! ReceiveViewController
    }
}

8

从UINavigationController中获取顶层视图控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showItems"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        ShowItemsTableViewController *showItemsTVC = (ShowItemsTableViewController * )navigationController.topViewController;
        showItemsTVC.items = [self itemsFromCoreData];
    }
}

0
在 prepare for segue 中查看视图控制器类 - 它是 nav 控制器。将其转换为该类,然后您可以通过请求其顶部视图控制器来访问所需的视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接