繁体   English   中英

为什么简单的模态视图控制器在显示和关闭时会滞后?

[英]Why would a simple modal view controller lag when presented and dismissed?

我的应用程序的主视图是UIImagePickerController相机视图。 当应用程序变为活动状态(在didBecomeActive中)时,我将提供一个模式视图控制器,该控制器显示从网络请求生成的一些设置。 (请注意,出于调试目的,我取出了网络请求,目前仅显示一个虚拟视图)

模态视图动画流畅,但加载后冻结3秒钟,然后正常响应。 消除视图(动画效果也很流畅)后,我的图像选择器控制器暂停2秒钟,然后正常恢复。

我已从模态视图控制器中删除了所有功能,以确保没有任何操作阻塞主线程。 我介绍了最基本的控制器,但仍然得到了不稳定的ui。 我会怀疑这是由于我的呈现视图控制器调用了viewDidLoad / Unload或类似的东西,但是当显示模式视图时,我的搜索没有提供有关呈现视图控制器中调用了哪些委托方法的任何信息。

我的问题可以通过回答来解决:

  • 显示模式视图时,在演示者中调用了哪些委托方法?
  • (如果有^)我如何不能调用这些方法,或者使它们运行得更流畅?
  • 模态视图控制器有哪些常见的陷阱?

有多种调用方法。 ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDidDisappear。 检查所有这些方法。 另外,检查您创建的所有子视图,并查看它们是否在我声明的方法中的线程上进行了涉及图像加载的任何操作。 模拟器和测试设备中也会发生这种情况吗?

ModalViewControllers没有太多陷阱,但可以了解在诸如导航堆栈之类的东西上分配了多少个视图,以及彼此之间有多少个视图。 当您摆脱模态视图控制器时,您会调用dismissviewcontroller吗?

这可能是因为您在主线程中进行了大量处理(通常是在UI停止时,这是因为主线程处理了)。 尝试为我们提供一些代码,特别是您认为最重的处理代码! 对不起我的英语不好:P! 尝试使用以下命令将最繁重的代码分发到另一个线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //your heavy code here =)
});

问候,卢卡斯

可能造成一些轻微延迟的一件事是每次都从头开始重新加载相同的viewController。

BProfileTableViewController * _profileViewController = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:profileViewController];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

您可以在此处看到,如果这是在tableView上单击的,则每次应用程序需要再次创建viewController时,请单击。 如果相反,我们只是重用视图,那么它可以消除某些滞后。

将此添加到头文件中

BProfileTableViewController * _profileView;

然后,模态视图加载代码更改为:

// Open the users profile
if (!_profileView) {
    _profileView = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
}

UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:_profileView];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

这意味着我们只是重新加载视图,而不是重新创建视图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM