我有一个UITabBarController,它将UIView-Subclass(ImageViewer)作为它的第三个标签。
在这个ImageViewer子类中,我调用viewDidAppear
方法:
- (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)时,处理(选择选项卡时)将停止,同时前一个选项卡仍在显示。仅在第二个断点后单击“继续”时,才会显示视图。 (仅供参考,NSLogs是进行的。)
在这种情况下,viewDidAppear
的行为更像viewWillAppear
....
可能发生的任何线索?
干杯
答案 0 :(得分:10)
如果您希望在加载视图时重新绘制屏幕,但要在-viewDidAppear:
中触发其他更新代码,请使用performSelector: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将能够在您加载视图后重新绘制屏幕。 {em}将在 next 事件循环中调用updateUI
。如果在加载视图后必须执行计算密集型计算或更新,这是获得快速视图转换的好方法。
答案 1 :(得分:0)
从它的声音来看,如果您正在主动调用该方法,则设备可能没有时间在viewDidAppear方法中运行“自定义代码”时实际显示视图。在这种情况下,您应该让程序调用viewDidAppear方法本身。
您的程序也可能正在处理会降低视图外观的其他代码,这可以使用计时器来解决。即代替:
[self otherCode];
你会写:
[NSTimer scheduledTimerWithTimeInterval:.5
target:self
selector:@selector(otherCode)
userInfo:nil
repeats:NO];
你可能想尝试用这种方式用计时器延迟你的“自定义代码”。