Iphone 为什么视图在显示之前显示在UITabBarController exec中?
我有一个UIAbbarController,它嵌套一个UIView子类(ImageViewer)作为它的第三个选项卡 在这个ImageViewer子类中,我调用Iphone 为什么视图在显示之前显示在UITabBarController exec中?,iphone,xcode,viewdidappear,Iphone,Xcode,Viewdidappear,我有一个UIAbbarController,它嵌套一个UIView子类(ImageViewer)作为它的第三个选项卡 在这个ImageViewer子类中,我调用viewdideappear方法: - (void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; /* ... start custom code ... NSLog(@"viewDidAppear tag 1 passed);
viewdideappear
方法:
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
/* ... start custom code ...
NSLog(@"viewDidAppear tag 1 passed); /* BREAKPOINT 1 here
[myUIActivityIndicator stopAnimating];
NSLog(@"viewDidAppear tag 2 passed); /* BREAKPOINT 2 here
/* ... end custom code ...
}
该方法是自动调用的,但奇怪的是,视图只有在该方法被完全处理后才会出现
当我如图所示设置断点(1和2)时,处理(在选择选项卡时)停止,而上一个选项卡仍在显示。只有在第二个断点后单击“继续”时,才会显示视图。(仅供参考,立即执行NSLOG)
在这种情况下,viewdideappear
的行为更像viewWillAppear
有什么线索吗
欢呼声如果您正在主动调用该方法,则当设备在ViewDidDisplay方法中运行“自定义代码”时,可能没有时间实际显示视图。在这种情况下,您应该让程序调用viewdidappease方法本身 您的程序也可能正在处理其他代码,这会减慢视图的显示速度,这可以通过使用计时器来解决。i、 e.而不是:
[self otherCode];
你会写:
[NSTimer scheduledTimerWithTimeInterval:.5
target:self
selector:@selector(otherCode)
userInfo:nil
repeats:NO];
您可能希望尝试用计时器以这种方式延迟“自定义代码”。如果您希望在加载视图时重新绘制屏幕,但要在
-viewdide:
中触发一些其他更新代码,请使用性能选择器:withObject:afterDelay:
,如下所示:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(updateUI) withObject:nil afterDelay:0.0];
}
…
- (void)updateUI
{
// Do your UI stuff here
}
当您这样做时,当前事件循环将很快完成,UIKit将能够在加载视图后重新绘制屏幕
updateUI
将在下一个事件循环中调用。如果必须在加载视图后执行计算密集型计算或更新,这是一种获得快速视图转换的好方法。您真的按照您的建议“调用”了该方法吗?不,该方法是在选择了选项卡3后自动调用的。看起来系统还没有找到时间重新绘制屏幕。这可能就是你什么都看不到的原因。这在iOS5中不会发生。我想这是UITabViewController中的一个bug。太好了,谢谢。这让我摆脱了症状。我会留下这条线索,看看是否有治愈的根本原因。。。我在第一代iPodtouch上运行这个应用程序,它似乎因为这个原因崩溃了。。。