performSegueWithIdentifier:从didSelectRowAtIIndexPath调用的方法缓慢显示视图

时间:2014-01-23 08:44:04

标签: ios uitableview segue didselectrowatindexpath

我有一个静态的UITableview,我试图转向模态视图。我不能直接从故事板中的单元格中删除,因为有时我希望根据某些应用程序逻辑不调用segue。所以我把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上的动画复选框,它会立即生效。如果有人能提供帮助,我将非常感激。

4 个答案:

答案 0 :(得分:4)

你可以直接从故事板中的单元格中删除。还有另一种委托方法可用于控制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;
  }

答案 1 :(得分:1)

这似乎是一个线程问题。只需将调用包装到performSegueWithIdentifier,并将调度发送到主线程。就像黄油一样!

dispatch_async(dispatch_get_main_queue(), {
    self.performSegueWithIdentifier("SegueName", sender:self)
})

答案 2 :(得分:0)

试试这个,因为发件人应该是控制器对象

(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];
    }
   }
 }

答案 3 :(得分:0)

我有同样的问题。我没有进行过广泛的测试,但它似乎发生在iOS 8.1而不是iOS 7.1.2中。奇怪的是,第二次进行放松时,延迟甚至更长。 (例如:点击按钮呈现UITableViewController,点击关闭按钮放松,重新打开它,重新关闭它 - 慢!)

当你呈现你的tableViewController时,你是否将任何内容传递给sender:?我这样传递self

[self performSegueWithIdentifier:@"TableViewSegue" sender:self];

...但我发现传递nil会使放松延迟几乎消失。有时它仍然在那里,但在iPhone 6上只有0.5秒左右。这样一个奇怪的问题。我还在unwind命令中取出了sender:self,以防万一。

经过一些更多的测试后,大约有五分之一的时间它会以真的可怕的延迟展开...大约4-5秒!第二次点击这一行似乎实际上是立即放松了。但哇,这个bug非常讨厌。我们应该在其上提交错误报告:https://bugreport.apple.com/