3

我有一个 UITabBarController,它嵌套了一个 UIView 子类(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......

任何线索可能会发生什么?

干杯

4

2 回答 2

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 将能够在你的视图加载后重新绘制屏幕。updateUI在下一个事件循环中调用。如果您必须在视图加载后执行计算密集型计算或更新,这是获得快速视图转换的好方法。

于 2010-11-29T08:46:34.580 回答
0

从它的声音来看,如果您正在主动调用该方法,则设备在运行 viewDidAppear 方法中的“自定义代码”时可能没有时间实际显示视图。在这种情况下,您应该让程序自己调用 viewDidAppear 方法。

您的程序也可能正在处理其他会减慢视图外观的代码,这可以使用计时器来解决。即代替:

[self otherCode];

你会写:

[NSTimer scheduledTimerWithTimeInterval:.5 
    target:self 
    selector:@selector(otherCode) 
    userInfo:nil 
    repeats:NO];

您可能想尝试以这种方式简单地使用计时器延迟您的“自定义代码”。

于 2010-11-28T19:06:24.667 回答