延迟呈现模态视图控制器

问题描述:

我有一个基于标签栏的应用程序。在所有5个选项卡中都有导航控制器,并将自定义视图控制器实例设置为根视图控制器。这加载得很好。这些视图控制器中的一些包含表视图。我想在表格视图中选择一行时向用户显示模式视图控制器。该didSelectRowAtIndexPath方法委托方法(的相关部分)如下所示:延迟呈现模态视图控制器

SampleSelectorViewController *sampleVC = [[SampleSelectorViewController alloc] init]; 
[self presentViewController:sampleVC animated:YES completion:NULL]; 

模态视图控制器显示,但它很明显的延迟后出现。有时甚至需要用户再次点击该行。我已经核实有几件事情是:当用户点击该行

  • 的didSelectRowAtIndexPath方法方法不包含任何阻塞调用

    • 表视图的didSelectRowAtIndexPath方法方法被调用。没有网络操作正在执行,并且模态视图控制器的设置不涉及任何处理密集型任务。它显示的数据是静态的。
    • 如果我将新的视图控制器放到导航堆栈上(其他所有内容完全相同),它的行为完全没有任何延迟。只有在模态呈现时才会遇到延迟。

    任何意见/建议?

  • +0

    出于兴趣,是它同样慢用'动画:NO' ? – pbasdf 2014-10-20 15:30:18

    +0

    就是这样。动画似乎对这种奇怪的行为没有影响。 – 2014-10-20 15:40:15

    +0

    有趣。我遇到同样的延迟模式显示问题(或者不得不点击屏幕使其显示)。在我的情况下,它不是直接的,而是通过didSelectRowAtIndexPath间接触发的。调用一个委托方法,它调用委托方法,它以模态方式呈现。嗯.. – 2017-08-10 05:29:57

    您应该从根vc(例如:customTabBarRootViewController)模态显示它。 保存一个参考,并使用参考控制器来显示它。

    +0

    当你说root vc ,你的意思是在我的窗口中的根vc这将是我的标签栏控制器在这种情况下? 另外,如果可能的话,我会非常感兴趣的知道它的原因 – 2014-10-21 09:54:00

    +0

    我不知道原因我只知道它对我的工作完美无缺地运行iOS7的iPhone 4编译xCode6.0.1 – Gilad 2014-10-21 11:08:15

    +0

    是的我的意思是选项卡如果在显示的视图控制器上存在“繁重的代码”,请尝试使用dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { //您的沉重代码在此=)来包装它,否则它将保存它 – Gilad 2014-10-21 11:08:40

    它似乎在呼叫presentViewController:animated:completiontableView:didSelectRowAtIndexPath:是有问题的。当在乐器中使用Time Profiler时,也很难找到任何突出的东西。有时候,我的模态观点不到一秒钟,有时需要4秒甚至9秒。

    我认为它与底层的UIPresentationController和布局有关,这是我在选择连续点击和查看Time Profiler中的模态演示文稿之间的时间区域时看到的少数几个事情之一。

    的雷达存在说明这个问题:http://openradar.appspot.com/19563577

    解决方法很简单,但不令人满意:延迟呈现小幅避免任何有争议的行为是造成增长放缓。

    dispatch_async(dispatch_get_main_queue(), ^{ 
        [self presentViewController:nav animated:YES completion:nil]; 
    }); 
    
    +1

    谢谢你。你的修补程序适合我,但同意它有点不令人满意。 – Rogare 2015-02-07 02:01:49

    +1

    谢谢azsromej的回复。我有点卡在其他一些事情上。我会尝试尽快验证修复程序,如果它能正常工作,请接受您的答案,但在我能做到这一点之前可能会有一段时间。 – 2015-02-09 12:21:59

    +0

    这为我修复http://*.com/questions/29830698/uisearchcontroller-wont-dismiss-searchbar-and-overlap-for-ios-8-swift – DogCoffee 2015-11-21 11:26:51

    tableView:didSelectRowAtIndexPath:看起来像苹果的错误,我也有这个奇怪的延迟。

    虽然这个解决方案似乎工作得很好。

    CFRunLoopWakeUp(CFRunLoopGetCurrent()); // Fixes a bug where the main thread may be asleep, especially when using UITableViewCellSelectionStyleNone 
    

    解在夫特3

    在SampleSelectorViewController(所呈现的视图控制器)使用下面的代码

    DispatchQueue.global(qos: .background).async { 
    
    // Write your code 
    
    } 
    
    +0

    您需要在主队列中分派。所以使用:'DispatchQueue.main.async {}' – 2017-10-24 12:13:41