使用"显示详细信息" segue用于替换溢出视图控制器中的详细视图控制器

时间:2014-08-11 22:02:52

标签: ios objective-c segue uisplitviewcontroller uistoryboardsegue

我正在使用带有自适应segue的通用故事板来构建我的界面。我有一个UISplitViewController,其中UITableViewController设置为主视图控制器。我正在使用此表来呈现两种不同类型的信息,因此当用户点击一个单元格时,我需要找出他们点击的单元格,以便显示适合所选单元格的两个不同视图控制器之一。我在Storyboard中设置了关系,让详细视图控制器成为两个视图控制器中的第一个,这很好,因为我无论如何直到他们点击一个单元格来渲染UI。我发现我可以从表视图控制器创建一个segue到我的另一个视图控制器,当点击一个合适的单元时应该显示它 - 这是一个“显示细节(例如替换)”segue。我给它一个标识符,当选择了适当的行继续并用正确的视图控制器替换细节中的现有视图控制器时,我只需调用[self performSegueWithIdentifier:ReplaceDetailSegueIdentifier sender:self];。当我选择应该显示第二个视图控制器的单元格时,这很有效。它正确地用第二个视图控制器替换第一个细节视图控制器。然后我设置了另一个segue,当用户然后点击应显示原始第一个视图控制器的行时将执行该segue。但是当发生这种情况时,应用程序会在执行segue的行崩溃(但没有信息记录到控制台 - 只是说明EXC_BAD_ACCESS)。

所以似乎一旦您执行了一次Show detail segue,后续调用替换详细视图控制器会使应用程序崩溃。如果我选择用第二个视图控制器替换原始细节控制器的行,然后选择应显示相同第二个视图控制器的另一行 - 应用程序崩溃,也是如此。

如何进行设置,以便根据所选的单元格正确显示相应的详细视图控制器,确保应用不会崩溃?

2 个答案:

答案 0 :(得分:1)

我发现崩溃是由于释放详细视图控制器UISplitViewControllerDelegate引起的,因此主控引用了一个不存在的对象。解决方案是将委托设置为将要呈现的新视图控制器(如果它不符合UISplitViewControllerDelegate则为nil)。现在它没有问题。

答案 1 :(得分:0)

您应该像往常一样将segue挂钩到细胞选择,然后您可以确定在prepareForSegue中选择了哪个细胞,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ...