【问题标题】:Setting a property in a segue with Navigation Controller containing another view使用包含另一个视图的导航控制器在 segue 中设置属性
【发布时间】:2013-11-15 11:26:21
【问题描述】:

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

转场:

- (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,它会起作用,但我真的需要那里的导航。我该如何解决这个问题?

【问题讨论】:

    标签: ios objective-c uinavigationcontroller segue


    【解决方案1】:

    从 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】:

      对于斯威夫特:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我猜这对于选项卡栏控制器来说会是相似的吗?感谢您的帮助。
        • 我发现有时人们会得到合适的 VC,有时却得不到。很奇怪。是否有某种配置告诉应用程序获取最终目标视图控制器?
        • 也可以使用[navController topViewController]
        • @mikebz,我有 2 个 segue,都是模态的,一个来自单元格,第二个来自条形按钮项。一个给我一个导航视图控制器,第二个给我最终的目标视图控制器。很奇怪。
        • 迅速:segue.destinationViewController.topViewController
        【解决方案4】:

        查看prepare for segue 中的视图控制器类——它是导航控制器。将其转换为该类,然后您可以通过询问其顶部视图控制器来获得所需的视图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          相关资源
          最近更新 更多