36

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

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>.'

これは私が何ヶ月も触れていない古いプロジェクトですが、何がそのようなエラーを引き起こすのだろうか?

4

5 に答える 5

149

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

前:

ここに画像の説明を入力してください

  1. メインビューをViewControllerの子の外に移動します。
  2. XIBからViewControllerを削除します(ファイルの所有者はすでにそのクラスに属している必要があるため、必要ありませ

後:

ここに画像の説明を入力してください

于 2012-09-16T21:11:20.000 に答える
8

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

上記の修正に相当するもの、つまり、Viewオブジェクトをトップレベルにドラッグして提供されたMixerHostViewController.xibを編集し、それを含んでいた空のViewControllerを破棄することは、完全に機能しました(ただし、何時間も作業する前ではありませんでした)根本的な問題が何であったかを突き止めたので、私は、今のところAppleによってやり直されていると感じています。彼らは何かを引き締めたようですが、サンプルアプリが壊れたかどうかをわざわざチェックしませんでした)。

于 2012-10-03T16:16:56.337 に答える
4

私のペン先がUIViewControllerトップレベルのファイルにあるときに、この問題が発生しました。それで、Nibからのロードがそれを作成し、それから私はあなたのコードUIViewControllerの位置にあった私のクラスからそれを使おうとしました。MapViewController

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

于 2012-09-15T18:05:15.673 に答える
0

あなたはこのようにそれをするべきです。

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];
于 2012-09-15T06:25:56.063 に答える
0

場合によっては、NIBからUIViewControllerを削除せに、別のアプローチをとる方がよい場合もあります。これは、たとえば、NIBの階層からView Controllerを削除すると、自動レイアウトのマージンが失われるためです。

UIViewControllerをnib(.xib)に残し、ファイル所有者クラスにそのアウトレットを作成してみませんか?次に、コードでView Controllerを直接インスタンス化するのではなく、UINibクラスを使用してnibをロードし、最適なタイミングで(メモリ/リソース使用量の観点から)、nibインスタンスのinstantiateWithOwner()メソッドを呼び出して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)
于 2014-12-24T18:04:24.880 に答える