我有一个在我的ViewController
中运行此功能的iphone3g- (void)viewDidAppear:(BOOL)animated {
[super viewDidLoad];
}
我使用的是TabBar iphone应用程序。但是,当我从选项卡1单击选项卡2并调试第二个视图控制器时,它将在视图实际位于用户视图中之前停止。
因此,当您单击选项卡2直到内部的每个函数 - (void)viewDidAppear:(BOOL)动画完成后,用户才能看到该视图。
ViewDidShowToUser函数在哪里?现在我运行了一些函数,所以它有时很慢而且你认为按钮不能正常工作..
答案 0 :(得分:4)
首先,您在[super viewDidLoad]
[super viewDidAppear:animated]
而不是-viewDidAppear:
其次,使用调试器和断点可以人工查看应用程序的行为方式。在实际使用中,用户不会注意到-viewDidAppear:
方法在实际显示视图之前会返回。
真正的问题是你的工作需要很长时间才能完成并使应用程序看起来很迟钝。您应该考虑异步执行工作,并且有几个选项可以做到这一点。
在viewDidAppear:
实施中,您可以使用performSelector:withObject:afterDelay:
排队工作。此方法将立即返回并安排在您指定的任何时间段内调用您的选择器。如果你传递0作为延迟,它将排队等候在运行循环的下一次迭代中运行,有效地为你提供了一种从方法返回并保持用户界面响应的方法。
你可以使用积木,如果你没有针对iOS4以下的任何东西,并利用Grand Central Dispatch的力量来安排好你的工作。
答案 1 :(得分:1)
你在viewDidLoad上调用super:viewDidAppear:....将行[super viewDidLoad];
更改为[super viewDidAppear:animated];
答案 2 :(得分:0)
没有简单的说法。
UIKit制作UIViews。 UIViews吸引了CALayers。 CALayers由CoreAnimation处理。
CoreAnimation决定何时要求UIView绘制图层。它在屏幕上绘制所有图层,然后在GPU上进行合成。只有在它们被合成之后,屏幕才会显示更新的UI。这种解耦是为了让CoreAnimation独立于UI线程完成大部分工作,但这意味着你无法轻易分辨出“实际在屏幕上”的内容。
没有简单的方法来判断屏幕实际显示的内容(除了现在的私有UIGetScreenImage())。 viewDidAppear:在UIKit完成构建(和动画)视图/图层后调用。此时,它们将在下一个运行循环后被CoreAnimation“看到”,并在此后不久显示。如果你在viewDidAppear:中进行大量处理,那么CoreAnimation将永远不会看到更新的“模型树”。