web-dev-qa-db-ja.com

モーダルビューコントローラーを表示しようとしたときのUIViewControllerHierarchyInconsistency

次のコードでモーダルビューコントローラーを提示しようとしています

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];
    mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentModalViewController:mapView animated:YES];
    [mapView release];

次のエラーが発生し続ける。

'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x1ed815a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1ed81600>> is associated with <UIViewController: 0x1ed835a0>. Clear this association before associating this view with <MapViewController: 0x1dd947c0>.'

これは私が何ヶ月も触れなかった古いプロジェクトです、そのようなエラーを引き起こす可能性があるのはなぜですか?

36
Sam J.

これは、最新のXcodeリリースですでに2回起こりました。どちらの場合も、UIViewControllerのXIBファイルに変更を加える必要がありました(あなたの場合はMapViewController.xibになります:

BEFORE:

enter image description here

  1. メインビューを移動ビューコントローラの
  2. 削除 XIBからView Controller(File's Ownerはすでにそのクラスに属しているはずなので、必要ありません):

後:

enter image description here

149
Lukasz

IOS 6シミュレータでAppleのサンプルオーディオアプリMixerHostを実行すると、この問題が発生しました。

上記の修正に相当するもの、つまり、提供されたMixerHostViewController.xibを編集して、Viewオブジェクトをトップレベルにドラッグし、それを含んでいた空のViewControllerを破棄することは、完全に機能しました(ただし、何時間も作業をする前は根本的な問題が何であったかを理解しているので、Apple現時点で完了したように感じています-彼らは何かを厳しくしているようですが、サンプルアプリが壊れていないかどうか確認する必要はありませんでした)。

8
JulianSymes

私のNibがファイルの最上位にUIViewControllerを持っていると、この問題が発生しました。したがって、Nibからロードすると、そのUIViewControllerが作成され、コードでMapViewControllerの位置にあるクラスからそれを使用しようとしました。

私の場合、解決策は単にUIViewControllerをNibファイルから削除することでした。

4
Bryan

場合によっては、別の方法を使用してnotをUIBから削除する方がよい場合もあります。これは、NIBの階層からビューコントローラを削除すると、自動レイアウトマージンが失われるためです。

NiView(.xib)にUIViewControllerを残して、ファイル所有者クラスにそのアウトレットを作成しないのはなぜですか?次に、コード内でビューコントローラを直接インスタンス化するのではなく、UINibクラスを使用してnibをロードし、最適なタイミングで(メモリ/リソース使用の観点から)、nibインスタンスのinstantiateWithOwner()メソッドを呼び出してNIBをアーカイブ解除して接続しますnibは、所有者クラスのアウトレットに反対します。

    @IBOutlet var myViewController: myViewController?

    var nib : UINib?
    nib = UINib(nibName: "TheNib", bundle: nil)
    if (nib == nil) {
        println("could not load nib: TheNib.xib")
    }
    nib!.instantiateWithOwner(self, options: nil)
0
clearlight

このようにすべきです。

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];
UINavigationController *navCntrlr = [[UINavigationController alloc] initWithRootViewController:mapView];
mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
//hide navigation bar if needed
[self.navigationController presentModalViewController:navCntrlr animated:YES];
[mapView release];
0
Paresh Navadiya