Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么视图在显示之前显示在UITabBarController exec中?_Iphone_Xcode_Viewdidappear - Fatal编程技术网

Iphone 为什么视图在显示之前显示在UITabBarController exec中?

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);

我有一个UIAbbarController,它嵌套一个UIView子类(ImageViewer)作为它的第三个选项卡

在这个ImageViewer子类中,我调用
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上运行这个应用程序,它似乎因为这个原因崩溃了。。。