ロードされたペン先ですが、「ビュー」アウトレットが設定されていません


742

プロジェクトに新しいnibファイルを追加し、それをロードしようとしました。

ただし、作成したビューに移動するはずのツールバーアイコンをクリックするNSInternalInconsistencyExceptionと、次のメッセージが表示されます。

キャッチされない例外 'NSInternalInconsistencyException'によりアプリを終了しています。理由: '-[UIViewController _loadViewFromNibNamed:bundle:]は "..." nibをロードしましたが、ビューアウトレットが設定されていませんでした。'

それで、nibファイルを開いたところ、参照先のコンセントが設定されていないことがわかりました。しかし、「新しい参照アウトレット」の円をクリックしてファイルの所有者にドラッグしようとしましたが、それができません...ビューを表示するために何をする必要がありますか?


1
最初にビルドをクリーンアップしてみてください。
LetynSOFT 2015

私の場合、実際のエラーは、エラーを引き起こしたViewControllerメソッドをオーバーライドするメソッドをviewController(-(void)setValue:(NSNumber *)value forKey:(NSString *)key)で定義したことです。私はこのメソッドの名前を変更しました
クリスチャンミニ

回答:


1807

あなたたちは正しいですが、私は新人なので、それを行うためのすべての手順を理解するのに少し時間がかかりました。これが私のために働いたものです:

  • 問題の原因となっているXIBファイルを開く
  • 左側のバーにあるファイルの所有者アイコンをクリックします(上部のアイコン、黄色の枠で囲まれたボックスのように見えます)
  • 右側のサイドバーが表示されない場合は、ツールバーの「表示」の上にある3番目のアイコンをクリックしてください。右側のサイドバーが表示されます
  • 右側のサイドバーで、3番目のタブ(新聞のように見えるタブ)をクリックします。
  • 上部の「カスタムクラス」の下で、クラスがこのビューに対応するViewControllerの名前であることを確認します。そうでない場合は、入力してください
  • 右側のサイドバーで、最後のタブをクリックします-矢印の入った円のようなタブです
  • その下に「view」のある「outlet」が表示されます。その隣の円を左側のバーの「ビュー」アイコンまでドラッグします(下のもの、太い灰色の輪郭を持つ白い正方形のように見えます)
  • xibを保存して再実行します

私はココアでもこの問題に直面し、ビューがロードされなかったり、ビュー階層に追加されなかったりする限り、すべてのビューアウトレットはNILでした。addSubviewまたは同様のものを呼び出した後、すべてのアウトレットが接続されました。私の話の面白い部分は、po viewcontroller.view.subviewsが不足しているオブジェクトを示していたことです。
Apoc 2015年

11
このソリューションは、ステップ4と5の時点でXcode 7.3では機能しなくなりました。代わりに、インターフェイスビルダーで、ファイルの所有者からビューにControlキーを押しながらドラッグします。
PeiweiChen

2
私にとっては機能しませんでした(接続インスペクタにアウトレットセクションがないため、接続するアウトレットの下の "ビュー"はありません)が、回答に費やした労力は+1でした。:)
ウィリアムT.マラード

2
アウトレットに「ビュー」が表示されない場合は、ファイルの所有者からストーリーボードのビューにctlr-ドラッグすることもできます。コンテキストメニューが「表示」オプション付きで表示されるはずです
josef

1
@ WilliamT.Mallard私は同じ動作をします。MyViewControllerのサブクラスのサブクラスでUIViewControllerあり、view「アウトレット」の下にはありません。ビューMyViewControllerから直接サブクラス化するとUIViewController、「アウトレット」が表示されます。Xcodeのマジックまたはバグ。
user2319066

201

これはジョシュジャスティスの提案ですが、グラフィカルな方法(写真は私のものです):

  1. ファイルの所有者を選択
  2. 右側のパネルでカスタムクラスを選択します。
  3. カスタムクラス名を入力してください

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

  1. 右側のパネルで、オーレットを選択します
  2. ビューアウトレットをドラッグしてコンポーネントを表示します

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

最後に、View Controllerはローリングコードでインスタンス化されます。

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];

1
Javier CalatravaLlaveríaに感謝します... 1時間頭を殴った後、私を助けてくれました!!!
BharathRao

un exito muchas gracias
Bruno Sosa Fast Tag

5番目のステップを逃しました
hamada147

73

一般的には、ファイルの所有者とビューの間の接続を再作成することで修正できます。ファイルの所有者から(IBの)ビューにControlキーを押しながらドラッグし、ポップアップメニューから[ビュー]を選択します。


62

ビューID-クラスIDが設定されていません。適切なクラスに設定した後、問題は解決されました。


こんにちは@John、これを実行しましたが、まだこの例外が発生しています。
Mansuu .... 2017

29

yourViewControllerの「view」プロパティに割り当てられたUIView(またはサブクラス)があることを確認しますか?

yourViewControllerのxibの左側のペインで「ファイル所有者」を右クリックし、「ビュー」アウトレットが設定されていることを確認します。そうでない場合は、ビューに設定してください!

これは間違いなく問題を修正します


2
明確で簡潔な答え。
sark9012

15

私にとってここで述べられているすべてのものはhttps://stackoverflow.com/a/6395750/939501は真実でしたが、それでもエラーをスローしていました、理由は私がABCViewという名前のビュークラスを作成し、その後それを削除したのでビューコントローラーを追加しましたABCViewControllerなので、どういうわけか新しいABCViewViewで古いABCViewを参照していたので、ABCViewControllerを削除して、問題を解決した別の名前の新しいABCViewControllerを追加する必要がありました。

ありがとう


2020年にはまだバグがあります。
TamásSengel

15

XCode 4.6.3でも同じ問題が発生しました。私は名前のカップルのファイルで始まっていたMySettingsView.h.mしかしの賛成でそれらを削除したMySettingsViewController.h、が、ヒントのほとんどがここで言及しようとしたにもかかわらず、それはまだでerroring保管しました

2013-07-05 11:48:17.205 MyApp [39024:c07] ***キャッチされない例外 'NSInternalInconsistencyException'が原因でアプリを終了しました、理由: '-[UIViewController _loadViewFromNibNamed:bundle:]が "MySettingsView" nibをロードしましたが、ビューアウトレット設定されていません。」

MySettingsView Controller .xibの代わりにMySettingsView.xibをロードしようとすると、明らかに「混乱」していました。たぶん、その「私が言っていることを実行する」ロジックは空想的すぎるかもしれません。

そこで、私はMySettingsViewController.mにNIB / XIB名をハードコーディングすることで問題を回避しました。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}

10

xibメソッドを使用してUIViewを作成し、この問題が発生している人にとっては、接続インスペクターメニューの下に「ビュー」アウトレットがないことに気付くでしょう。ただし、ファイルのOwnersカスタムクラスをUIViewControllerに設定すると、「ビュー」アウトレットが表示されます。これは、CMNDをアウトレットをCustomViewに接続するだけです。


驚くばかり。どうもありがとうございます。これは受け入れられる答えになるはずです!
ローマ、

7

これに関する私の問題は、ビューが設定されていないクラスフォルダーにnibが重複していることが原因でした。xcodeはビルド用に1つのnibを選択し、次にプロジェクトをビルドしたときに別のnibを選択しているようです。もう一方を削除しました。いいね。どー!


6

nibから開始したときにビューコントローラーでビュープロパティが設定されていない理由を見つけるために、1時間以上費やしました。ビューコントローラのinitWithNibName内で「[super initWithNibName ...]」を呼び出すことを忘れないでください。


5

私はこれを修正しました。大規模なプロジェクト、2つのファイル。1つは「ReallyLargeNameView」で、もう1つは「ReallyLargeNameViewController」でした。

上記で選択した2番目の回答に基づいて、ビルドをクリーンアップする必要があると判断しました。灘ですが、私はまだXCodeの疑いがありました(2つの同一のクラスがあるので、それらを抽象化する必要がありますが、ええと...)ですから、1つは機能していますが、1つは機能していません。これまでのところ、ファイルの所有者名はコピーアンドペーストされ、アウトレットは再フックされ、xCodeは再起動されましたが、まだ何もありません。

そこで、同様の名前付きクラス(ビュー)を削除します。すぐに、新しいエラー「アウトレットの内部が接続されていない」は文字通り「キー値ではなくwebView」でした...基本的には「Visual Studioの方が良い」と言っています。とにかく...私は小さい名前のファイルを削除し、BAM、それは動作します。

XCodeは、類似した名前のファイルによって混乱しています。そして、プロジェクトは少し再起動する必要があるほど大きく、その一部かもしれません。

「XCodeは混乱しています」よりも技術的な答えが欲しいのですが、現時点では、xCodeはかなり混乱しています。混乱しないで、私が小さな子供を助けるのと同じように。それは今動作します:)上記が何も修正しない場合、他の人に利益をもたらすはずです。

常にビルドをクリーンアップすることを忘れないでください(シミュレーターも削除することにより)


4

私も同じ問題があり、私の問題は、他のローカリゼーション(英語)をViewControllers nibに追加したため、ローカリゼーションドイツ語の私のアプリがローカリゼーション英語のnibを見つけることができませんでした。これが誰にも役立つことを願っています!


4

誤ってxib参照を削除して再度追加しているときに同じ問題に直面しました。Filesオーナーとビューを接続することで修正しました。また、FilesOwnerのカスタムクラスが予想されるviewControllerであることを確認してください。


3

私にとって、問題はを呼び出すことによって引き起こされましたinitWithNibName:bundle:。nibファイルのテーブルビューセルを使用して、上に配置されるエントリフォームを定義していtableViewsます。私にはビューがないので、それにフックするのは意味がありません。代わりに、代わりにinitWithStyle:メソッドを呼び出し、そこからnibファイルをロードすると、期待どおりに動作します。


3

以前の回答で問題はほぼ解決しましたが、最後の手順がありませんでした。

  1. 同じ名前でxibとswiftファイルを作成します。

ビューとSwiftファイルを追加

  1. ファイル所有者をUIViewサブクラスに設定します。

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

  1. アウトレットをビューからUIViewサブクラスにドラッグし、「contentView」という名前を付けます

contentviewを追加する

  1. このカスタム初期化子を追加して、xibがロードされるときにcontentViewをアタッチするようにします

contentviewをサブビューとして追加する

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

追加した@IBOutletsがアタッチされます。

乾杯、リチャード


2

私は同じ問題を抱えていましたが、少し異なる解決策が求められていました。この場合の問題は、ビューのクラスではなく、ファイル所有者のクラスでした。これを設定するには、Interface Builderウィンドウの左下隅にある「逆再生」アイコンをクリックする必要があり、その後、ファイル所有者、ファーストレスポンダー、およびビューの特性を分離するオプションが表示されました。最初のもの(大きな透明なボックス)をクリックすると、上記のようにカスタムクラスを設定できます。


2

私も同じ問題を抱えていましたが、別の解決策が求められていました。この場合の問題は、ファイル所有者のクラスがxibファイルに接続されていないことでした。


2

今夜、Swift UIViewControllerサブクラスを使用して、非常によく似たものに遭遇しました。この場合、上記の修正はどれもうまくいきませんでしたが、コードを並べ替えると少しうまくいきました。同じファイル内のサブクラスの定義自体がXCodeを混乱させるように見える前に、サブクラスへの拡張機能を持つNet-netは、正常にコンパイルされていますが、修正は、サブクラスの定義の後に拡張を配置することでした。

詳細はこの同様の質問への回答に投稿しました。


2

私の場合、- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil*** ViewControllerクラスの指定イニシャライザが実装されているため、他のイニシャライザを呼び出してオブジェクトを初期化しても、指定イニシャライザが呼び出されます。

したがって、この問題を解決するに- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilは、適切な方法であるかどうかを確認することもできます。


2

私はここで他の答えとは少し異なる方法でこの問題に遭遇しました。

新しいxibファイルを作成し、Interface BuilderでそれにUIViewControllerを追加し、そのUIViewControllerのカスタムクラスをビューコントローラーに設定すると、「ビューアウトレットが設定されていません」というクラッシュが発生しました。ここの他の解決策は、ビューアウトレットをコントロールにドラッグしてビューに表示するように言っていますが、私にとっては、ビューアウトレットはグレー表示されており、コントロールドラッグできませんでした。

グレー表示されたビューアウトレット

私の間違いは、Interface BuilderでのUIViewControllerの追加にあることがわかりました。代わりに、UIViewを追加し、ファイルの所有者のカスタムクラスをビューコントローラーに設定する必要がありました。次に、ファイルの所有者のビューアウトレットを新しいビューUIViewにコントロールドラッグして、すべてが正常に機能しました。


1

私のプロジェクトでは同じエラーが発生しましたが、理由は異なります。私の場合、カスタムUITableViewControllerクラスに「View」という名前のIBOutletセットアップがありました。「view」は基本クラスのメンバーであるため、特別であることがわかっていましたが、View(別のケース)も問題になるとは思いませんでした。Cocoaの一部の領域では大文字と小文字が区別されないと思います。おそらく、xibのロードはそれらの領域の1つです。そのため、名前をDefaultViewに変更しただけで、すべて正常に動作します。


1

ファイルの所有者を選択し、IDインスペクターを開いて、対応するクラス名を指定します。上記の方法のいずれも機能せず、それでもビューアウトレットが表示されない場合は、新しい参照アウトレットにファイルの所有者への接続を与えると、ビューアウトレットを表示できます。ビューアウトレットをクリックして、ビューアウトレットとファイルの所有者を接続します。これで問題なく動作するアプリケーションを実行します。


1

私の場合、ビューはxibで表示されませんでした。xibでは、ビューはサイズ=なし(4番目のタブの右側)でした。サイズをフリーフォームに設定し、xCodeをリロードします。ビューは上訴され、適切なリンクをビューに設定しました。


1

すべてを試してもこのエラーが発生する場合は、最初からクラスファイルを再作成してください。ただし、[XIBファイルも作成する]チェックボックスをオンにしてください。これにより、これらのファイルを個別に作成するときにリンクされていないいくつかのアイテムが自動的にリンクされます。これが作成されたら、おそらくすべてを新しいXIBにカットアンドペーストすることができ、問題なく動作するはずです。

私は特にSwiftでファイルを個別に作成することでこの問題を見つけています。


1

私にとってそれは起こったとき

  • Nibファイルに関連付けられたViewControllerクラス(.mm / h)があります。
  • このViewControllerのUIViewをサブビューとして別のビューにロードする必要があります。

  • このようなものを呼び出します

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

どこ

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

ここでloadViewがありませんでした。この行を追加すると問題が解決しました。


1

私は同じ問題を抱えていました、私は理解しました、そしてそれは私がコンテンツオプションの下のテーブルビューのプロパティで「静的セル」をチェックしたためです。「」に変更すると動作しました。スクリーンショットは下にあります。 Dynamic Prototypesここに画像の説明を入力してください


1

Xcode 9.3でも同様の問題があり、「ファイル所有者」の属性インスペクターの下にある「モジュール」をプロジェクトモジュールに設定すると、これが修正されました。


1

開いているストーリーボードのあなたのViewControllerが存在するファイル、またはXIBと関連ファイルtextEdit.appをし、ストーリーボードまたはXIB名はあなたのViewControllerのと同じであるかどうかを確認し、それを変更し、保存してリロード/再起動のXcode。


1

カスタムのinitメソッドを使用している場合は、有効な何かを返していることを確認してください。次のようなコードでクラッシュするコードに遭遇しました。

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

別のクラスでは、コントローラーは次のように作成されました。

CustomController *controller = [[CustomController alloc] init];

問題は、initメソッドでは、selfは変更されておらず、代わりに次のようになるはずです。

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}

0

私はスティーブンJを2番目にしたいと思います。Xコードが混乱することがあります。UIを何度もいじって、コンセントを何度も追加したり削除したりした経験がありました。コンセントはもはやもう配線しません。特定の理由を理解することは決してなく(上記のすべての解決策を試しました)、NIBを削除して最初から再作成する必要があり、実際に機能するためには、NIBに別の名前を使用する必要がありました。(XCode 4.6.1)そのために数時間を無駄にしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.