在视图出现之前,为什么viewDidAppear在UITabBarController exec中?

时间:2010-11-28 15:16:05

标签: iphone xcode viewdidappear

我有一个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 ....

可能发生的任何线索?

干杯

2 个答案:

答案 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];

你可能想尝试用这种方式用计时器延迟你的“自定义代码”。