performSegueWithIdentifier无法在某些设备上运行

时间:2012-10-10 15:32:41

标签: ios ios6 uistoryboardsegue

我遇到了一个完全让我困扰的问题。 performSegueWithIdentifier在大多数设备上运行得非常好,但是当我在ios版本6.0的iPad上运行程序时,segue就不会发生了。

以下是我的代码的工作原理:

我打电话给performSegue:

[self performSegueWithIdentifier:@"watchSegue" sender:self];

Storyboard segue 这会触发目标视图控制器的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。

如果有人深入了解可能出现的问题,我将非常感激。

1 个答案:

答案 0 :(得分:1)

我不确定这是否100%正确,因为它似乎未在Apple中记录,iOS6的视图加载顺序已更改。

在iOS5中,在调用prepareForSegue之前,目标视图控制器已准备就绪,并且视图已加载。但在iOS6中,目标视图控制器尚未加载视图。因此,如果您的代码修改了任何与UI相关的内容,它将无法在iOS6上运行。

我的解决方案是在:prepareForSegue

中显式调用[destVC loadView]