prepareForSegue 调用了两次

Posted

技术标签:

【中文标题】prepareForSegue 调用了两次【英文标题】:prepareForSegue called twice 【发布时间】:2014-03-31 10:01:18 【问题描述】:

我有一个UINavigationController,其中加载了UITableview。在这个UITableView 里面,我有一个prototype 单元格,我用静态数据重复使用了几次,这些数据永远不会改变,也永远不会改变。因此,我将来自viewControlller 的两个推送序列连接到两个destination 视图控制器。这似乎工作得很好。为了调用这些segues,我使用了UItableViews 委托方法:didSelectRowAtIndexPath,所以我知道点击了哪一行,然后转到正确的viewController

不,问题,它有效。

然后我添加了第三个viewController 及其随附的segue 以匹配,与didSelectRowAtIndexPath 中的前两个和相同设置相同 - 现在,当我点击第二个单元格时,它正在工作,didSelectRowAtIndexPath按预期调用,然后调用正确的segue,然后调用prepareForSegue。然后,prepareForSegue 再次被调用(此时,didSelectRowAtIndexPath 还没有被再次调用)prepareForSegue 方法然后调用不正确的 segue(我添加的第三个 segue)。

我不知道是谁第二次调用prepareForSegue 方法,以及为什么它得到了错误的标识符。

我做错了什么吗?

一些代码示例

这里是didSelectRowAtIndexPath

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    switch (indexPath.row)
    
    case CategoryFilter:
        
            [self performSegueWithIdentifier:@"FilteredCategoryView" sender:self];
        break;
        
    case PriceFilter:
        
            [self performSegueWithIdentifier:@"FilterByPriceSegue" sender:self];
        
    case ConditionFilter:
        
            [self performSegueWithIdentifier:@"SearchFilterConditionSegue" sender:self];

        
    

然后在prepareForSegue方法中:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if ([segue.identifier isEqualToString:@"FilteredCategoryView"])



       //No data to pass just yet 


    
    if ([segue.identifier isEqualToString:@"FilterByPriceSegue"])
       //No data to pass just yet 

    
    if ([segue.identifier isEqualToString:@"SearchFilterConditionSegue"])

       //No data to pass just yet 
    

在上述方法中 - 我还没有传递数据,但我会的。它的这个方法被调用了两次。

【问题讨论】:

添加了唯一一点调用 segues 的代码。不确定您要查找的其他代码是什么?感谢您的帮助。 检查segues的属性是否有差异。所有三个 segue 是否都连接到它们自己的单元格,或者是否有任何 segue 连接到视图/tableview?听起来像是自动触发了一个segue。也许视图触发了非手动的 segue? 每个 segue 都连接到 viewController。单击每个 segue 会突出显示整个 viewController,而不是 viewController 中 UitableView 的单元格。从 didSelectRowAtIndexPath 中删除代码 - 没有调用 segue,也没有推送任何视图,正如预期的那样。 【参考方案1】:

您在switch 的第二种和第三种情况下忘记了break,也许它会有所帮助;)

改变你的开关:

switch (indexPath.row)

    case CategoryFilter:
    
        [self performSegueWithIdentifier:@"FilteredCategoryView" sender:self];
         break;
    
    case PriceFilter:
    
        [self performSegueWithIdentifier:@"FilterByPriceSegue" sender:self];
         break;
    
    case ConditionFilter:
    
        [self performSegueWithIdentifier:@"SearchFilterConditionSegue" sender:self];
         break;
    

如果您没有在每种情况下都使用 break 指令,则 switch 将执行所有其他情况,直到 switch 或另一个 break 指令结束。

【讨论】:

啊,你是对的。我确实忘记了休息。通常我不会忘记的东西。这么简单的事情。谢谢老兄。金发时刻! 享受 ;) 显而易见的东西有时是最难找到的 ;)

以上是关于prepareForSegue 调用了两次的主要内容,如果未能解决你的问题,请参考以下文章

didUpdateToLocation 调用了两次,好的。为啥 oldLocation 两次都为零?

ViewDidLoad 调用了两次

didRegisterUserNotificationSettings 被调用了两次?

ListSelectionListener 调用了两次

Cedar - 检查是不是使用不同的值调用了两次方法

OnLoadFinished() 调用了两次