2013-05-03 154 views
3

我刚刚搬进了我的iOS 5的项目到iOS 6的环境(因为苹果做出强制要求支持4英寸设备保持兼容),现在我有一个位,而有问题的将UIViewController推至UINavigationControllerUI块,而在推视图控制器导航控制器

当我按自定义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和取出笔尖文件,什么都没有改变。
  • 没有被加载在pushViewController和加载的UIViewController之间。
  • 此问题发生在我的iPhone 4 - iOS 5设备上。一切工作正常iOS 5和6模拟器也适用于我的iPhone 5 - iOS 6设备。
  • 我对我的项目的其他部分推其他视图控制器为好,但这个UIViewController中似乎是唯一的问题。
  • 视图控制器被推主线程上,因此视图控制器被加载在主线程
  • 上在此阻塞期间,的XCode(4.6.1)也被阻断并且不作出响应,以及
+0

将您的iphone升级到ios 6版本,或者在您的项目设置中设置ios 5兼容性 – Nagasaki 2013-05-03 09:50:15

+0

,而不是self中的'super'= [super initWithNibName:@“CampaignDetailViewController”bundle:nil];为什么不使用'self'就像[self initWithNibName:@“CampaignDetailViewController”bundle:nil]; – 2013-05-03 09:50:32

+0

@Nagasaki部署目标设置为iOS 5.0。还有什么要设置的吗? – Bartu 2013-05-03 09:53:14

回答

3

两个提示:

1 - 这是问题发生在模拟器或真实设备上?我在模拟器上遇到过很多意想不到的延迟。

2 - 记得打电话

[super viewWillAppear:animated]; 

[super viewDidAppear:animated]; 

的impelentations内。

从苹果文档:

如果重写此方法,您必须在您执行某些时候调用超。

+0

它发生在真实设备上,并且我添加了viewWillAppear和viewDidAppear以测试发生了什么,当它开始发生时,甚至没有添加这些函数。是的,超级也被添加,它仍然挂起 – Bartu 2013-05-08 14:35:34

+1

好吧,我认为你的观点有问题。尽管init方法返回的速度很快,但从nib加载视图控制器时,其视图实际上只在第一次视图调用时加载(可能是上部navcontroller调用addsubview时)。为了确保缓慢的部分是这样的,请重写'loadView'方法(仅实现'[super loadView]'调用)并查看需要执行多少时间。如果挂在那里,视图上有东西会减慢负载(你有没有使用仪器?) – LombaX 2013-05-08 15:02:55

+0

为了调试的目的,你甚至可以避免调用'[super loadView]'并在''手动创建一个空视图' loadView'方法。 – LombaX 2013-05-08 15:06:22

0

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

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

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

enter image description here

0

在我的情况的问题是与UILabel阴影。

相关问题