使用"Show detail" segue 替换溢出视图控制器中的详细信息视图控制器



我使用带有自适应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];
        ...

最新更新