2

私は完全に困惑している問題に直面しています。performSegueWithIdentifier はほとんどのデバイスで問題なく動作しますが、iOS バージョン 6.0 を搭載した iPad でプログラムを実行すると、セグエが発生しません。

私のコードの仕組みは次のとおりです。

私は performSegue を呼び出します:

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

絵コンテセグエ 宛先View Controllerの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 では呼び出されず、実際にセグエは実行されません。

私は実際には別の iPad アプリを持っていないことに注意することが重要です。単に iPad で iPhone アプリを実行しているだけなので、コードとストーリーボードは同じです。

------------更新 1: 5.1.1 を実行している iPhone でこのバグを再現できました。私のセグエがこれまでずっと機能していた(そしてこのバージョンで機能している)理由は私には理解できませんが、この1つのケースだけで機能しなくなります...

----------更新 2: 残念ながら、この回答では、この問題をより深く理解することも、再発を防ぐこともできません。しかし、私は問題を修正しました。

セグエを削除してストーリーボードに追加し直すことで、問題を解決できました。viewDidLoad が呼び出され、セグエが実行されるようになりました。

誰かが何がうまくいかなかったのかについての洞察を持っているなら、私はそれを大いに感謝します.

4

1 に答える 1

1

これが Apple に文書化されていないように見えるので、これが 100% 正しいかどうかはわかりません。iOS6 のビューの読み込み順序が変更されています。

iOS5 では、:prepareForSegue が呼び出される前に、目的のビュー コントローラーの準備が整い、ビューが読み込まれます。しかし、iOS6 では、宛先のビュー コントローラーはまだビューをロードしていませんでした。そのため、コードで UI 関連のものを変更すると、iOS6 では機能しません。

これに対する私の解決策は、[destVC loadView] を :prepareForSegue で明示的に呼び出すことです

于 2012-10-15T17:35:28.677 に答える