使用包含另一个视图的Navigation Controller在segue中设置属性

时间:2013-11-04 18:31:05

标签: ios objective-c uinavigationcontroller segue

我在尝试在我的segue中设置属性时遇到了崩溃。这是一个UIView将属性传递给一个导航控制器,它有一个TableView作为它的根视图。它应该转到我的TableViewController,但它看起来像是被NavigationController截获并抛出一个无法识别的选择器错误。

Segue公司:

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

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

错误:

-[UINavigationController setItems:]: unrecognized selector sent to instance 0x10920c840

这里发生了什么? NavigationController没有与之关联的类,它只是在故事板中并以模态方式出现。如果我将故事板中的segue设置为直接转到视图而不是NavigationController,它可以工作,但我真的需要导航那里。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:74)

由于目标视图控制器实际上是导航控制器,因此请尝试访问根视图,如下所示:

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

答案 1 :(得分:7)

从UINavigationController获取topViewController:

- (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];
    }
}

答案 2 :(得分:7)

对于Swift:

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

答案 3 :(得分:0)

查看准备segue中的视图控制器类 - 它是导航控制器。将它投射到该类,然后通过询问它的顶视图控制器,您可以到达所需的视图。