iOS 在视图出现之前调用 viewDidAppear
iOS viewDidAppear called before view appears
我正在开发带有 UISplitView 的 iPhone/iPad 应用程序。在左侧面板中,我有一个 table,所有单元格都有 "Show Detail" 连接到右侧面板的导航控制器。
在用户在 table 中选择一个选项后,我为新视图做了一些冗长的计算,所以我有一个 UIActivityIndicatorView,我在 "viewWillAppear" 中开始设置动画。在 viewDidAppear 中,我执行计算,然后刷新适当的 UI 元素并停止 UIActivityIndicatorView。
这在 iPhone 上按预期工作:用户点击 table 中的项目,出现新视图,没什么可说的(但显示了一点 activity 指示器),然后一两秒钟后,它会填入正确的信息。
在 iPad 上,看起来应用程序在点击 table 中的项目后冻结了。然后数据在几秒钟后出现。 (我的测试 iPad 是第一代 mini,所以速度较慢,这对我没有帮助。)没有 activity 指标。
在调试中,我发现在视图出现之前,viewDidAppear 实际上被调用了。在 viewDidAppear 方法 returns 之前,显示没有任何变化。我已经看到它有一个断点,但我也通过在 viewDidAppear 的开头和结尾放置 NSLog 语句来确认它没有断点。
所以这看起来很糟糕;我想知道我是否可以对我的 Segue、View Controller、Navigation Controller 或 Split View 控制器做些什么来让它按照我想要的方式运行?
提前致谢...
你应该异步执行此操作,你的性能会受到影响,因为你渲染数据的过程相当大且耗时,你需要的是在
内完成所有这些
//Show you spinner here
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread, your logic for get data
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates and hide spinner`enter code here`
});
});
它可能会如您所愿。
我最终通过添加延迟计算解决了这个问题。 viewDidAppear先出现view的基本情况还是很烦人,不过这个workaround就涵盖了。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Use delayed computation to get around "viewDidAppear" sometimes being called before view appears.
[self.activityIndicator startAnimating];
[self performSelector:@selector(delayedComputation) withObject:nil afterDelay:0.01f];
}
- (void)delayedComputation
{
// (Perform lengthy calculations...)
// (Refresh UI with results...)
[self.activityIndicator stopAnimating];
}
我正在开发带有 UISplitView 的 iPhone/iPad 应用程序。在左侧面板中,我有一个 table,所有单元格都有 "Show Detail" 连接到右侧面板的导航控制器。
在用户在 table 中选择一个选项后,我为新视图做了一些冗长的计算,所以我有一个 UIActivityIndicatorView,我在 "viewWillAppear" 中开始设置动画。在 viewDidAppear 中,我执行计算,然后刷新适当的 UI 元素并停止 UIActivityIndicatorView。
这在 iPhone 上按预期工作:用户点击 table 中的项目,出现新视图,没什么可说的(但显示了一点 activity 指示器),然后一两秒钟后,它会填入正确的信息。
在 iPad 上,看起来应用程序在点击 table 中的项目后冻结了。然后数据在几秒钟后出现。 (我的测试 iPad 是第一代 mini,所以速度较慢,这对我没有帮助。)没有 activity 指标。
在调试中,我发现在视图出现之前,viewDidAppear 实际上被调用了。在 viewDidAppear 方法 returns 之前,显示没有任何变化。我已经看到它有一个断点,但我也通过在 viewDidAppear 的开头和结尾放置 NSLog 语句来确认它没有断点。
所以这看起来很糟糕;我想知道我是否可以对我的 Segue、View Controller、Navigation Controller 或 Split View 控制器做些什么来让它按照我想要的方式运行?
提前致谢...
你应该异步执行此操作,你的性能会受到影响,因为你渲染数据的过程相当大且耗时,你需要的是在
内完成所有这些 //Show you spinner here
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread, your logic for get data
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates and hide spinner`enter code here`
});
});
它可能会如您所愿。
我最终通过添加延迟计算解决了这个问题。 viewDidAppear先出现view的基本情况还是很烦人,不过这个workaround就涵盖了。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Use delayed computation to get around "viewDidAppear" sometimes being called before view appears.
[self.activityIndicator startAnimating];
[self performSelector:@selector(delayedComputation) withObject:nil afterDelay:0.01f];
}
- (void)delayedComputation
{
// (Perform lengthy calculations...)
// (Refresh UI with results...)
[self.activityIndicator stopAnimating];
}