【问题标题】:performSegueWithIdentifier:method called from didSelectRowAtIIndexPath slow to show viewperformSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图
【发布时间】: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 上的动画复选框,它会立即生效。如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

    标签: ios uitableview segue didselectrowatindexpath


    【解决方案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/

        【讨论】:

          猜你喜欢
          • 2016-04-22
          • 2012-04-26
          • 2013-07-24
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 2014-01-03
          • 2016-06-07
          • 1970-01-01
          相关资源
          最近更新 更多