0

I have an iphone3g with this function running in my ViewController

- (void)viewDidAppear:(BOOL)animated {

[super viewDidLoad];

}

I use a TabBar iphone app. But when I click from tab 1 to tab 2 and debug the secondView Controller it is stopped before the view is actually in the users view.

So there for when you click tab 2 until every function inside - (void)viewDidAppear:(BOOL)animated is complete the user gets to see the view.

Where is the function ViewDidShowToUser? Now I have a few functions running so it's sometimes slow and you're thinking the button is not working really..

4

3 回答 3

4

首先,你是在调用[super viewDidLoad]而不是[super viewDidAppear:animated]在你的实现中调用-viewDidAppear:

其次,使用调试器和断点可以人为地查看您的应用程序的行为方式。在实际使用中,用户不会注意到该-viewDidAppear:方法在实际显示视图之前返回。

真正的问题是您的工作需要很长时间才能完成,并使应用程序显得迟缓。您应该考虑异步执行工作,并且您有几个选项可以做到这一点。

  1. 在您的viewDidAppear:实现中,您可以使用performSelector:withObject:afterDelay:排队工作。此方法将立即返回并安排您的选择器在您指定的任何时间段内被调用。如果您将 0 作为延迟传递,它将在运行循环的下一次迭代中排队运行,从而有效地为您提供一种从方法返回并保持用户界面响应的方式。

  2. 如果您的目标不是低于 iOS4 的任何东西,您可以使用块,并利用 Grand Central Dispatch 的强大功能将您的工作顺利而安全地完成。

于 2010-08-10T15:46:22.587 回答
1

你在 viewDidLoad: inside viewDidAppear: 内调用 super: ....将行更改[super viewDidLoad];[super viewDidAppear:animated];

于 2010-08-10T15:36:27.057 回答
0

没有简单的方法可以分辨。

UIKit 制作 UIViews。UIViews 绘制到 CALayers。CALayers 由 CoreAnimation 处理。

CoreAnimation 决定何时要求 UIView 绘制图层。它在屏幕上绘制所有图层,然后在 GPU 上合成它们。只有在它们合成之后,屏幕才会显示更新的 UI。这种解耦的发生是为了让 CoreAnimation 能够独立于 UI 线程完成大部分工作,但这意味着你不能轻易分辨出“实际在屏幕上”是什么。

没有简单的方法可以判断屏幕何时实际显示了某些内容(除了现在私有的 UIGetScreenImage())。viewDidAppear:在 UIKit 完成构建(和动画)视图/层之后被调用。此时,CoreAnimation 将在下一次运行循环后“看到”它们,并在此后不久显示。如果您在 viewDidAppear: 中进行大量处理,那么 CoreAnimation 将永远不会看到更新后的“模型树”。

于 2010-08-10T18:30:23.340 回答