我使用带有自适应segue的通用故事板来构建我的界面。我有一个UISplitViewController
和一个UITableViewController
设置为主视图控制器。我使用这个表来呈现两种不同类型的信息,所以当用户点击一个单元格时,我需要弄清楚他们点击了哪个单元格,以便为所选单元格显示两种不同视图控制器中的一种。我在Storyboard中设置了关系让detail视图控制器成为两个视图控制器中的第一个,这很好,因为我渲染UI是在它们点击一个单元格之前。我发现我可以创建一个从表视图控制器到我的另一个视图控制器的segue,当一个适当的单元格被点击时,它应该被显示——这是一个"显示细节(例如替换)"segue。我给了它一个标识符,当选择合适的行时,我简单地调用[self performSegueWithIdentifier:ReplaceDetailSegueIdentifier sender:self];
,然后用正确的视图控制器替换细节中的现有视图控制器。当我选择一个应该显示第二个视图控制器的单元格时,这工作得很好。它用第二个视图控制器正确地替换了第一个细节视图控制器。然后我设置了另一个segue它会在用户点击一行时执行它会显示最初的第一个视图控制器。但是当发生这种情况时,应用程序在执行segue的行崩溃(但是没有信息记录到控制台-只是状态EXC_BAD_ACCESS)。
所以似乎一旦你执行了一次Show detail segue,随后替换detail视图控制器的调用会使应用程序崩溃。如果我选择一行用第二个视图控制器替换原来的细节控制器,然后选择另一行显示相同的第二个视图控制器,应用程序也会崩溃。
我该如何设置它,以便它将正确显示适当的细节视图控制器基于他们所选择的单元格,确保应用程序不会崩溃?
我发现崩溃是由释放UISplitViewControllerDelegate
的详细视图控制器引起的,所以主控制器引用了一个不存在的对象。解决方案是将委托设置为将要呈现的新视图控制器(如果不符合UISplitViewControllerDelegate
,则为nil)。
您应该像往常一样将segue与单元格选择挂钩,然后您可以确定在prepareForSegue中选择了哪个单元格,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
...