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 调用的方法缓慢显示视图