在我目前的应用程序中,我想多次使用某个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
。甚至可以以不同的导航方式使用相同的视图控制器吗?
我希望有足够的信息来帮助我解决这个问题。您可能知道,项目会增长,我不知道是否需要考虑更多代码:)
提前致谢!
答案 0 :(得分:0)
prepareForSegue:
方法不适合放置该代码。它是在执行segue之前调用的,这通常意味着已经完成了某种过渡。
我假设您已经将您的集合视图单元格与segue连接起来,并且现在正在尝试根据在collectionVC之前的viewcontroller来修改该segue的行为。
在这种情况下,有一些可能的解决方案:
UIStoryboardSegue
子类,可以处理不同的转换。见UIStoryboardSegue Class Reference。然后,您可以在prepareForSegue:
方法中设置自定义segue的某些属性,以告诉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];
}