我遇到了一个完全让我困扰的问题。 performSegueWithIdentifier在大多数设备上运行得非常好,但是当我在ios版本6.0的iPad上运行程序时,segue就不会发生了。
以下是我的代码的工作原理:
我打电话给performSegue:
[self performSegueWithIdentifier:@"watchSegue" sender:self];
这会触发目标视图控制器的initWithCoder:
-(id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if ( self ) {
}
return self;
}
触发prepareForSegue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
...
}
这是事情的不同之处。对于其工作的所有设备,将调用目标视图控制器的viewDidLoad:
- (void)viewDidLoad
{
....
然而,对于iPad iOS6.0,它不会被调用,并且实际上没有执行segue。
重要的是要注意我实际上没有不同的iPad应用程序,我只是在iPad上运行iPhone应用程序,因此代码和故事板是相同的。
------------更新1: 我刚刚能够在运行5.1.1的iPhone上重现这个bug。为什么我的segues一直在工作(并且在这个版本中工作)并且只是在这一个案例中他们停止工作...
-----------更新2: 遗憾的是,这个答案不会对这个问题有更多的理解,也不会阻止它再次发生。但我确实解决了这个问题。
通过删除segue并将其添加回故事板,我能够解决问题。现在调用viewDidLoad并执行segue。
如果有人深入了解可能出现的问题,我将非常感激。
答案 0 :(得分:1)
我不确定这是否100%正确,因为它似乎未在Apple中记录,iOS6的视图加载顺序已更改。
在iOS5中,在调用prepareForSegue之前,目标视图控制器已准备就绪,并且视图已加载。但在iOS6中,目标视图控制器尚未加载视图。因此,如果您的代码修改了任何与UI相关的内容,它将无法在iOS6上运行。
我的解决方案是在:prepareForSegue
中显式调用[destVC loadView]