3

我刚刚将我的 iOS 5 项目迁移到 iOS 6 环境(因为 Apple 强制要求支持 4 英寸设备兼容性),现在我在UIViewController推动UINavigationController.

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

这是发生的事情;

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

CampaignDetailViewController *detailViewController = [[CampaignDetailViewController alloc] initWithProduct:selectedProduct];
    [self.navigationController pushViewController:detailViewController animated:YES];

比我记录一切(我清除了所有代码viewDidLoadviewWillAppearviewDidAppear,这意味着推动控制器应该只加载笔尖)

上推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");
}

调试器日志;

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

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

更多信息

  • 我尝试使用常规init并删除了 nib 文件,没有任何改变。
  • 在 pushViewController 和加载 UIViewController 之间没有加载任何内容。
  • 这个问题发生在我的 iPhone 4 - iOS 5 设备上。在 iOS 5 和 6 模拟器上一切正常,在我的 iPhone 5 - iOS 6 设备上也能正常工作。
  • 我也在我项目的其他部分推送其他视图控制器,但这个 UIViewController 似乎是唯一的问题。
  • 视图控制器被推送到主线程上,因此视图控制器被加载到主线程上
  • 在此阻塞期间,XCode (4.6.1) 也被阻塞并且也没有响应
4

4 回答 4

4

两个提示:

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

2 - 记得打电话

[super viewWillAppear:animated];

[super viewDidAppear:animated];

在 impelentations 里面。

来自 Apple 文档:

如果你重写了这个方法,你必须在你的实现中调用 super 。

于 2013-05-08T11:05:30.723 回答
0

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

__weak CurrentViewController *wSelf = self;    
dispatch_async(dispatch_get_main_queue(), ^{
        [wSelf.navigationController pushViewController:wSelf.someController animated:YES];
});
于 2014-06-17T23:03:16.417 回答
0

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

在此处输入图像描述

于 2014-11-08T20:23:14.030 回答
0

就我而言,问题在于UILabel阴影。

于 2016-09-24T23:15:13.933 回答