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 两次都为零?