prepareForSegue叫了两次

时间:2014-03-31 10:01:18

标签: ios objective-c uistoryboardsegue

我有UINavigationController,其中加载了UITableview。在这个UITableView里面,我有一个prototype单元格,我重复使用了几次静态数据,这些数据永远不会改变,永远也不会。因此,我将两个推送segue从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 
    }
}

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

1 个答案:

答案 0 :(得分:4)

您在break的第二和第三个案例中忘记了switch可能会有所帮助;)

使用以下命令更改开关:

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指令,那么交换机将完成所有其他情况,直到交换机结束或另一个break指令。

相关问题