只有在添加第三个 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的主要内容,如果未能解决你的问题,请参考以下文章
仅当 git 标签不以字符串“Release”或“Test”开头时才在 Gitlab CI 中启动管道