只有在添加第三个segue时,才会在didSelectRowAtIndexPath之前调用prepareForSegue。

31

我有3个segue连接到3个不同的视图。其中2个没有问题,当第三个被创建时就出现了问题。

我有以下didSelectRowAtIndexPath方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@" ----------  did select row");

    if(indexPath.section == 0){
        if(indexPath.row == [self.data count]-1){
            //prior to adding this, everything works
            [self performSegueWithIdentifier:@"MoreComments" sender:self];
        }else{
            [self performSegueWithIdentifier:@"FriendView" sender:friend];
        }
    }else if(indexPath.section == 1){
        if(indexPath.row == [self.data2 count]-1){
            [self performSegueWithIdentifier:@"MorePosts" sender:self];
        }else{
            [self performSegueWithIdentifier:@"FriendView" sender:friend];
        }
    }
}

我有以下 prepareForSegue 方法:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"MorePosts"]){
        MorePostsViewController *mfamvc = segue.destinationViewController;
        mfamvc.data = self.data;
    }else if([segue.identifier isEqualToString:@"FriendView"]){
        FriendViewController *fvc = segue.destinationViewController;
        fvc.friend = friend;
    }else if([segue.identifier isEqualToString:@"MoreComments"]){
          MoreCommentsViewController *mcvc = segue.destinationViewController;
          mcvc.data = self.data2;
    }
}

在从我的单元格控制拖动到最后一个视图之前,我可以看到我的程序击中了didselectrow,然后准备seque。这使得所有的视图导航工作都很完美。

一旦我从我的单元格控制拖动到MoreCommentsViewController,我开始看到错误:

嵌套推送动画可能会导致导航栏损坏,以意外状态完成导航转换。导航栏子视图树可能会被破坏。

我注意到现在prepareforseque也被调用了两次,prepareforseque先被调用,然后是didselectrow,然后再次是prepareforsegue。

我做错了什么条件去这些不同的观点?


可能是连线方式出了问题。您能否描述一下在IB中的操作,或者发布一个故事板的图像链接?您是否直接从一个单元格原型连接多个连线?如果是这样,那就是问题所在。 - rdelmar
是的,我正在从一个单元格原型连接多个segue。我想这就是问题所在。 - Atma
2个回答

83
你应该使用didSelectRowAtIndexPath或从单元格中的连线,但不要同时使用两者。如果你想让didSelectRowAtIndexPath触发连线,那么这些连线应该不是从单元格到下一个场景,而是从场景上方的视图控制器图标开始:segue between view controllers 你现在可以选择这个新的连线,进入“属性检查器”(option+command+4),并提供一个故事板标识符,当你调用performSegueWithIdentifier时可以在代码中引用。

2
谢谢,这很有道理。 - MQoder
如何使用此方法获取目标视图控制器? - rigdonmr
@rigdonmr - 无论您是在界面构建器中添加了一个segue,还是在didSelectRowAtIndexPath中以编程方式调用了performSegueWithIdentifierprepareForSegue都将被调用,然后您可以在那里引用segue.destinationViewController - Rob
1
感谢您的帮助 :-) - Cauca

4

原因是您无法将表格视图单元格拖动到多个视图中。正如@rdelmar所提到的那样,这是错误的。您应该从目标视图拖动到源视图,然后手动处理上面所述的方式。

也可以在此处找到:在UITableViewCell上轻按时执行有条件的segue


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接