将视图控制器推送到导航控制器时的UI块

时间:2013-05-03 09:45:20

标签: iphone ios user-interface uiviewcontroller

我刚刚将iOS 5项目移至iOS 6环境(因为Apple强制要求支持4英寸设备兼容性),现在我在将UIViewController推送到{时遇到了一些问题{1}}。

在我推送自定义UINavigationController后,我的用户界面会阻塞5到20秒,这只是在我第一次推送自定义UIViewController时。如果我弹出我的UIViewController并再次推送它,则没有延迟或UI阻止。

以下是发生的事情;

首先我从UITableViewController的didSelectRowAtIndexPath推送我的UIViewController(自定义初始化工作正常,没有问题)

UIViewController

我正在记录所有内容(我清除了CampaignDetailViewController *detailViewController = [[CampaignDetailViewController alloc] initWithProduct:selectedProduct]; [self.navigationController pushViewController:detailViewController animated:YES]; viewDidLoadviewWillAppear中的所有代码,这意味着推送控制器只应加载nib)

推送viewDidAppear;

UIViewController

调试程序日志;

- (id)initWithProduct:(Product *)selectedProduct
{
    NSLog(@"starting init");
    self = [super initWithNibName:@"CampaignDetailViewController" bundle:nil];
    NSLog(@"nib loaded");
    if (self) {
        self.navigationItem.title = selectedProduct.name;
        self.product = selectedProduct;
    }
    NSLog(@"finishing init");
    return self;
}

- (void)viewDidLoad
{
    NSLog(@"starting viewdidload");
    [super viewDidLoad];
    NSLog(@"finishing viewdidload");
}

- (void)viewWillAppear:(BOOL)animated
{
    NSLog(@"view will appear");
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"view did appear");
}

viewWillAppear和viewDidAppear之间有超过30秒的延迟。

更多信息

  • 我尝试使用常规2013-05-03 12:33:49.678 my-app[1429:707] starting init 2013-05-03 12:33:49.680 my-app[1429:707] nib loaded 2013-05-03 12:33:49.683 my-app[1429:707] finishing init 2013-05-03 12:33:49.808 my-app[1429:707] starting viewdidload 2013-05-03 12:33:49.855 my-app[1429:707] finishing viewdidload 2013-05-03 12:33:49.861 my-app[1429:707] view will appear 2013-05-03 12:35:28.501 my-app[1429:707] view did appear 并删除了nib文件,没有任何改变。
  • 在pushViewController和加载UIViewController之间没有任何内容。
  • 此问题发生在我的iPhone 4 - iOS 5设备上。 iOS 5和6模拟器上的一切正常工作也适用于我的iPhone 5 - iOS 6设备。
  • 我正在推动项目其他部分的其他视图控制器,但这个UIViewController似乎是唯一的问题。
  • 视图控制器被推送到主线程上,因此视图控制器被加载到主线程
  • 在此阻止期间,XCode(4.6.1)也会被阻止,也不会响应

4 个答案:

答案 0 :(得分:4)

两个提示:

1 - 这个问题是在模拟器上还是在真实设备上发生的?我在模拟器上经历了许多意想不到的延迟。

2 - 记得打电话

[super viewWillAppear:animated];

[super viewDidAppear:animated];

在紧急情况下。

来自Apple文档:

  

如果覆盖此方法,则必须在实施中的某个时刻调用super。

答案 1 :(得分:0)

在块内执行UI代码时要小心,这应该在主线程内运行!如果不这样做,您可能会受到这种行为的影响,或者更糟糕的是因为UIKit不是线程安全的。

__weak CurrentViewController *wSelf = self;    
dispatch_async(dispatch_get_main_queue(), ^{
        [wSelf.navigationController pushViewController:wSelf.someController animated:YES];
});

答案 2 :(得分:0)

我发现了这个问题,我遇到了同样的问题,这是一个非常隐蔽的错误。我升级了我的项目,并且一些.xib文件未正确升级。在界面构建上选择.xib并检查项目部署目标是否为最后一个,并打开为默认项目(我的旧版本停留在旧版本,其余部分已更新)!

enter image description here

答案 3 :(得分:0)

在我的情况下,问题是UILabel带阴影。