performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图
Posted
技术标签:
【中文标题】performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图【英文标题】:performSegueWithIdentifier:method called from didSelectRowAtIIndexPath slow to show view 【发布时间】:2014-01-23 08:44:04 【问题描述】:我有一个静态 UITableview 并试图继续使用模态视图。我不能直接从情节提要中的单元格中转接,因为有时我希望根据某些应用程序逻辑不调用转接。所以我已经将 segue 连接到 TableViewController 并在 storyBoard 中给它一个标识符。然后在 TableViewController 中调用下面的方法。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//Perform segue when first row in first section is touched
if(indexPath.section == 0)
if(indexPath.row == 0)
[self performSegueWithIdentifier:@"view1" sender:self.view];
由于某种原因,当点击单元格时,模态视图的显示速度确实很慢。我已将 NSLogs 添加到模态视图 viewDidLoad 和 viewDidAppear 方法中,立即调用 viewDidLoad 但 viewDidAppear 很慢。这似乎仅在 tableView 加载后第一次点击单元格时发生。这似乎与 didSelectRowAtIndex 方法有关,因为我尝试从单元格上的按钮触发的 IBAction 调用 performSegueWithIdentifier 并且效果很好。另一点要提的是,如果我取消选中 segue 上的动画复选框,它会立即生效。如果有人可以提供帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:您可以直接从情节提要中的单元格中转接。还有另一种委托方法可以用于控制 segue 操作
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
[super shouldPerformSegueWithIdentifier:identifier sender:sender];
if ([identifier isEqualToString:@"SegueIdentifier"])
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
if (0 == indexPath.row)
if (0 == indexPath.row)
return YES;
return NO;
【讨论】:
这是否解决了您的问题? 这似乎是一个更好的解决方案,但由于某种原因,我的视图显示仍然出现延迟。我创建了一个只有两个视图的测试应用程序,没有数据,并且在第一次点击单元格时仍然出现延迟。如果我将 shouldPerformSegueWithIdentifier 方法注释掉,它可以正常工作 从不。此方法用于在触发 segue 时实现逻辑(如果需要)。实施这一点可能不会导致延迟。如果您的逻辑代码复杂且耗时,那么它可能需要一些时间才能完美运行。所以你的实际问题可能是别的。 好的,我已经删除了检查 indexPath 的 if 语句,因为这样做我不需要知道 indexPath,我将在其位置添加我自己的逻辑。这似乎成功了。在第一次点击单元格时,我仍然偶尔会出现延迟,但我注意到即使代码被注释掉也会发生这种情况,所以这一定是一个单独的问题。【参考方案2】:这似乎是一个线程问题。只需将调用包装到 performSegueWithIdentifier
并发送到主线程即可。像黄油一样工作!
dispatch_async(dispatch_get_main_queue(),
self.performSegueWithIdentifier("SegueName", sender:self)
)
【讨论】:
【参考方案3】:试试这个,因为 sender 应该是一个控制器对象
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//Perform segue when first row in first section is touched
if(indexPath.section == 0)
if(indexPath.row == 0)
[self performSegueWithIdentifier:@"view1" sender:self];
【讨论】:
【参考方案4】:我遇到了同样的问题。我没有进行广泛的测试,但它似乎发生在 ios 8.1 而不是 iOS 7.1.2 中。奇怪的是,当我第二次执行 unwind segue 时,延迟甚至更长。 (例如:点击一个按钮来呈现一个 UITableViewController,点击一个关闭按钮来展开,重新打开它,重新关闭它 - 慢!)
当您展示您的 tableViewController 时,您是否将任何内容传递给 sender:
?我像这样通过self
:
[self performSegueWithIdentifier:@"TableViewSegue" sender:self];
...但我发现传递 nil
反而会使展开延迟几乎消失。有时它仍然存在,但在 iPhone 6 上仅持续约 0.5 秒。真是个奇怪的问题。我还在我的 unwind 命令中取出了sender:self
,以防万一。
在进行更多测试后,大约五分之一的时间会以真的可怕的延迟...大约 4-5 秒!第二次轻敲该行似乎实际上可以立即放松火势。但是哇,这个错误非常讨厌。我们应该提交错误报告:https://bugreport.apple.com/
【讨论】:
以上是关于performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图的主要内容,如果未能解决你的问题,请参考以下文章
performSegueWithIdentifier 出现运行时错误,为啥?
iOS8 performSegueWithIdentifier 运行太慢
performSegueWithIdentifier:sender: 找不到我的转场
unwind segue / performSegueWithIdentifier: 问题
performSegueWithIdentifier 不起作用
performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图