2

我的应用程序的主视图是 UIImagePickerController 相机视图。当应用程序变得活跃时(在 didBecomeActive 中),我展示了一个模式视图控制器,它显示了从网络请求生成的一些设置。(请注意,出于调试目的,我取出了网络请求,目前只显示一个虚拟视图)

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

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

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

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

3 回答 3

2

调用了多个方法。ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDidDisappear。检查所有这些方法。此外,检查您创建的任何子视图,看看他们是否在他们的线程上做任何事情,涉及我所说的方法中的图像加载。这也发生在模拟器和测试设备中吗?

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

于 2013-06-03T17:59:51.707 回答
2

这可能是因为您在主线程中进行了大量处理(通常当 UI 停止时,这是因为主线程处理)。尽量给我们一些代码,特别是你认为最繁重的处理代码!对不起我糟糕的英语:P!尝试将最繁重的代码分派到另一个线程

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

问候,卢卡斯

于 2013-06-03T20:14:53.323 回答
0

可能导致一些轻微滞后的一件事是每次都从头开始重新加载相同的 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];

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

于 2015-06-05T11:16:36.153 回答