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

Posted

技术标签:

【中文标题】只有在添加第三个 segue 时才在 didSelectRowAtIndexPath 之前调用 prepareForSegue【英文标题】:prepareForSegue called before didSelectRowAtIndexPath only when third segue is added 【发布时间】:2013-08-12 12:09:56 【问题描述】:

我对 3 种不同的观点有 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];
        
    

我有以下 prepareForSeque 方法:

-(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,然后是 prepareforseque。这使得所有视图导航工作完美。

当我控制从单元格拖动到 MoreCommentsViewController 时,我开始看到错误:

嵌套推送动画可能导致导航栏损坏 在意外状态下完成导航转换。导航栏子视图树可能已损坏。

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

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

【问题讨论】:

segues 的连接方式可能有问题。您能否描述一下您在 IB 中所做的事情或发布指向您的故事板图片的链接?您是否直接从一个单元原型连接多个 segue?如果是这样,那就错了。 是的,我正在从一个单元原型连接多个 segue。我想这就是问题 【参考方案1】:

您应该使用didSelectRowAtIndexPath 或单元格中的segues,但不能同时使用两者。如果您希望 didSelectRowAtIndexPath 调用转场,这些转场应该从单元格到下一个场景,而是来自场景上方栏中的视图控制器图标:

您现在可以选择这个新的 segue,转到“属性检查器”(option+command+4),然后提供调用 performSegueWithIdentifier 时可以在代码中引用的故事板标识符。

【讨论】:

谢谢,这很有道理。 这个方法如何获取destinationViewController? @rigdonmr - 无论你是在界面生成器中添加了一个segue,还是你在didSelectRowAtIndexPath中以编程方式调用了performSegueWithIdentifier,无论哪种方式,都会调用prepareForSegue,然后你可以参考segue.destinationViewController 那里。 感谢您的帮助 :-)【参考方案2】:

原因是您不能从一个表格视图单元格拖动到多个视图。正如@rdelmar 提到的,这是错误的。您应该从目的地拖动到源视图,然后按照我上面的方式手动处理。

也可以在这里找到:Conditional segue performed on tap on UITableViewCell

【讨论】:

以上是关于只有在添加第三个 segue 时才在 didSelectRowAtIndexPath 之前调用 prepareForSegue的主要内容,如果未能解决你的问题,请参考以下文章

MongoDb 仅当数组不为空时才在数组中添加字段

仅当它不存在时才在 SQLite 中创建表

仅当 git 标签不以字符串“Release”或“Test”开头时才在 Gitlab CI 中启动管道

仅当前面有 (\d2 -) 时才在 html 中查找链接 (href) [重复]

仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花

仅当条件为 True 时才在 python 中使用 Eel 调用 JavaScript 函数