iOS + Storyboard:在导航中重用ViewControllers

时间:2013-04-21 11:59:08

标签: ios segue navigationcontroller

在我目前的应用程序中,我想多次使用某个UICollectionView,但具有不同的选择行为。将以下故事板布局视为“是”(并且正在工作):

Tab Bar Controller (2 items):
-> Navigation Controller 1 -> Collection View Controller -> some Table View Controller
-> Navigation Controller 2 -> (Basic) View Controller

Basic View Controller有两个UIButtons,其中包含Storyboard Push - 与Collection View Controller的关联。我想要的是从Basic View Controller转换到Collection View Controller,但是从集合中选择一个项目会弹出视图并返回Basic View Controller

我在Collection View Controller中设置了一个自定义属性,该属性在prepareForSegue的相应Basic View Controller消息中设置(如果用户选择Tab Bar Item,则根本不设置}),因此检测哪个控制器或哪个UI组件触发推送没有问题(有3种方法:选择标签栏项目或点击基本视图上的其中一个按钮)。

问题是弹出Collection View

到目前为止我的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ( self.mode == nil ) {
        // do nothing
    } else if ( [self.mode isEqualToString:@"foobar"] ) {
        // one way I tried
        [self dismissViewControllerAnimated:YES completion:nil];
    } else if ( [self.mode isEqualToString:@"blah"] ) {
        // other method
        BasicViewController *targetVC = self.navigationController.viewControllers[ 0 ];
        [self.navigationController popToViewController:targetVC animated:YES];
    }
}

不幸的是,我的应用在dismiss行中崩溃了。 popToViewController。甚至可以以不同的导航方式使用相同的视图控制器吗?

我希望有足够的信息来帮助我解决这个问题。您可能知道,项目会增长,我不知道是否需要考虑更多代码:)

提前致谢!

2 个答案:

答案 0 :(得分:0)

prepareForSegue:方法不适合放置该代码。它是在执行segue之前调用的,这通常意味着已经完成了某种过渡。

我假设您已经将您的集合视图单元格与segue连接起来,并且现在正在尝试根据在collectionVC之前的viewcontroller来修改该segue的行为。

在这种情况下,有一些可能的解决方案:

答案 1 :(得分:0)

“收藏视图控制器”中所选行的操作因“收集视图控制器”的显示位置而异。在一种情况下,返回“基本视图控制器”,在另一个情况下返回“某些表视图控制器”

通过使用以下内容定义tableView:didSelectRowAtIndexPath:来实现此目的:

- (void)        tableView: (UITableView *) tableView 
  didSelectRowAtIndexPath: (NSIndexPath *) indexPath
{
   if (self.parentIsBasicViewController)  // set in the incoming segue, probably.
      [self.presentingviewController dismissViewControllerAnimacted: YES completion: nil]
   else
      [self performSegueWithIdentifier: @"some Table View Controller" sender: self];
}