web-dev-qa-db-ja.com

ペン先をロードしましたが、 'view'アウトレットが設定されていませんでした

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

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

キャッチされていない例外 'NSInternalInconsistencyException'のためにアプリケーションを終了しています、理由: ' - [UIViewController _loadViewFromNibNamed:bundle:] "..." nibが読み込まれましたが、ビューアウトレットが設定されていませんでした。

それで私は自分のnibファイルを開いた、そして参照用のアウトレットが設定されていないという見方を見る。しかし、「新しい参照アウトレット」の円をクリックしてFile's Ownerにドラッグしようとしましたが、表示されないようにするにはどうすればよいですか。

685
John

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

59
John

あなたたちは正しいです、しかし私は新人であるのでそれをするためにすべてのステップを把握するのに少し時間がかかりました。これは私のために働いたものです:

  • 問題を引き起こしているXIBファイルを開く
  • 左側のバーにあるファイルの所有者アイコンをクリックします(上のアイコンは、黄色い枠で囲まれたボックスのように見えます)。
  • 右側のサイドバーが表示されていない場合は、ツールバーの[表示]の上にある3番目のアイコンをクリックしてください。これは右側のサイドバーを表示します
  • 右側のサイドバーで、3番目のタブ、つまり新聞のように見えるタブをクリックします。
  • 上部の「カスタムクラス」の下で、クラスがこのビューに対応する必要があるViewControllerの名前であることを確認します。そうでなければ、それを入力してください

Custom class configuration

  • 右側のサイドバーで、最後のタブをクリックします - 矢印が付いた円のように見えるもの
  • あなたはそれの下に "ビュー"と "アウトレット"が表示されるはずです。横にある円を左のバーにある[表示]アイコンまでドラッグします(下の丸、太い灰色の輪郭の白い四角のように見えます)

Custom class configuration

  • Xibを保存して再実行
1699
Josh Justice

これはJosh Justiceの提案ですが、グラフィカルな方法です(写真は私のものです)。

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

enter image description here

  1. 右側のパネルでoultetsを選択してください
  2. ビューアウトレットをビューコンポーネントにドラッグ

enter image description here

最後に、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];

私は一般的にファイルの所有者とビューの間の関係を作り直すことによってそれを修正することができます。ファイルの所有者から自分のビュー(IB内)にControlキーを押しながらドラッグし、ポップアップメニューからビューを選択します。

67
Rohit Mandiwal

YourViewControllerの "view"プロパティに割り当てられたUIView(またはサブクラス)がありますか。

YourViewControllerのxibの左ペインにある[File Owner]を右クリックして、[view]アウトレットが設定されていることを確認します。そうでない場合は、ビューに設定してください。

これは間違いなく問題を解決します

27
Shehbaz Khan

XCode 4.6.3でも同じ問題がありました。私はMySettingsView.h.mという名前のカップルファイルから始めましたが、MySettingsViewController.hを支持してそれらを削除しました、しかしここで言及されたヒントの大部分を試みるにもかかわらず、それはまだエラーになりました、

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];
}
14
Nathan

私のためにここに記載されているすべてのものは https://stackoverflow.com/a/6395750/939501 それでも真のエラーでした、理由はABCViewという名前のViewクラスを作成し、後でそれを削除したからです私はABCViewControllerとしてView Controllerを追加したので、どういうわけかそれは新しいView Controllerで古いABCViewを参照していました、私はABCViewControllerを削除し、私の問題を解決した別の名前の新しいものを追加しなければなりません。

ありがとう

13

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

6
Matt

Xibメソッドを使用してUIViewを作成していてこの問題を抱えている人には、接続インスペクタメニューの下に「表示」アウトレットがないことに気付くでしょう。しかし、File's OwnersカスタムクラスをUIViewControllerに設定すると、 "view"アウトレットが表示されます。これはアウトレットをCustomViewにCMND接続するだけです。

5
user2965721

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

上記で選択した2番目の答えに基づいて、私は自分のビルドをきれいにするべきだと決心しました。灘、しかし私はまだXCodeの疑いがありました(私は2つの同じクラスがあるので、それらを抽象化する必要がありますeh ...)ファイルの所有者名は、コピーと貼り付け、アウトレットの再接続、xCodeの再起動、そしてまだ何もしない限りです。

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

XCodeは同じ名前のファイルと混同されています。そして、プロジェクトは少し再起動する必要があるほど十分に大きいです、それはそれの一部かもしれません。

「XCodeは混乱しています」よりも技術的な回答をしてほしいのですが、xCodeはこの時点ではかなり混乱してしまいます。私が小さな子供を助けるのと同じ方法でそれを混同しないでください。今では動作します、:)上記の方法で何も解決されない場合は、他の人に役立つはずです。

常にあなたのビルドをきれいにすることを忘れないでください(シミュレータも削除することによって)。

4
Stephen J

私のビュープロパティがnibからそれを起動したときに私のビューコントローラに設定されていない理由を見つけることを試みるのに1時間以上を費やしただけです。 View ControllerのinitWithNibNameの中で、 "[super initWithNibName ...]"を呼び出すことを忘れないでください。

4
Kamil.S

私は同じ問題を抱えていて、私の問題は私が他のローカライズ版(英語)をViewControllersペン先に追加したので、ローカライズ版ドイツ語の私のアプリはローカライズ英語のペン先を見つけることができませんでした!これが誰かに役立つことを願っています!

3
Weini

誤ってxib参照を削除して再度追加したときにも同じ問題が発生しました。Files所有者とビューの間の接続を確立することで解決しました。FilesOwnerのカスタムクラスが必ずviewControllerになるようにしてください。

3
Nidhin

ViewControllerが存在するstoryboardファイルを開くか、XIBtextEdit.appで関連ファイルを開いて、ストーリーボードがまたはXIB名がviewControllerと同じである場合、それを変更し、Xcodeを保存してリロード/再起動します。

1

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

そのため、この問題を解決するには- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilをチェックするのも適切な方法です。

1
lynulzy

私にとっては、この問題はinitWithNibName:bundle:の呼び出しが原因でした。私はtableViewsの上に座るエントリーフォームを定義するためにnibファイルからのTable View Cellを使っています。私は見解を持っていないので、それに引っ掛かることは意味がありません。代わりに、代わりにinitWithStyle:メソッドを呼び出し、その中からnibファイルをロードすると、期待通りに動作します。

1
DaveDude

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

1
user1951454

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

1
Michael Stern

今夜はSwift UIViewControllerサブクラスで、非常によく似たものに出会いました。この場合、上記の修正はどれもうまくいきませんでしたが、コードの順序を少し変えるだけでした。サブクラスの拡張を持つNet-netは、同じファイル内のサブクラスの定義自体がXCodeを混乱させるように見えます。修正は、サブクラスの定義の後に拡張子を配置することでした。

詳細を掲載しました この類似した質問に対する回答の中に

1

私はXcode 9.3で同様の問題を抱えていました、そして、プロジェクトモジュールに "File Owner's"属性インスペクターの下の "Module"を設定することは私のためにこれを直しました。

0
nananta

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

0
OrdoDei

カスタム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
Declan Land

私は同じ問題を抱えていた、私が考え出した、それは私が Table View under contentオプション のプロパティで " Static cells "をチェックしたからです"Dynamic Prototypes"に変更されたときに動作しました。スクリーンショットは以下の通りです。 enter image description here

0
Saranjith

私のプロジェクトでも同じエラーがありましたが、理由が異なります。私の場合は、カスタムUITableViewControllerクラスに "View"という名前のIBOutletを設定しました。私は "view"が基本クラスのメンバーであるため特別であることを知っていましたが、View(別の場合)も問題になるとは思わなかった。私はCocoaのいくつかの領域が大文字と小文字を区別しないと思います、そしておそらくxibをロードすることはそれらの領域の1つです。だから私はただそれをDefaultViewに改名しただけで今はすべてうまくいっている。

0
eselk

ファイルの所有者を選択して、IDインスペクタを開いて、対応するクラス名を指定します。上記の方法のどれもうまくいかず、それでもあなたがビューアウトレットを見ることができないならば、File's Ownerに新しい参照アウトレットConnection接続を与えると、あなたはビューアウトレットを見ることができます。ビューアウトレットをクリックして、ビューアウトレットとファイルの所有者の間の接続を確立します。アプリケーションを実行してくださいこれはうまくいきます。

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

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

  • 我々はこのような何かを呼ぶでしょう

    -(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がありませんでした、、、この行を追加して私の問題を解決しました。

0
Amitg2k12

私はスティーブンJを2度目にしたいのですが、ときどきXコードが混乱することがあります。私はちょうど私がUIでたくさん遊んだ経験がありました、そしてアウトレットをかなり数回追加して、そして削除しました。コンセントはもう配線しないでしょう。私は特定の理由を考え出すことはしませんでした(私は上記のすべての解決策を試してみました)、そして私はNIBを削除して最初からそれを作り直さなければなりません(XCode 4.6.1)2、3時間無駄にしました。

0
BrianH

@objcで異なる名前空間を参照するSwiftコードがある場合、Objective-Cクラス名を使用してください。

@objc(NamespacedSomeViewController)
class SomeViewController: UIViewController {
....

この場合、IBでNamespacedSomeViewControllerを使用する必要があります。

0
Gomfucius

以前の答えは ほぼ 私のために問題を解決しましたが、最後のステップはありませんでした。

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

Add View and Swift File

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

enter image description here

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

add the contentview

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

add the contentview as a subview

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]
    }

追加した@IBOutletが添付されます。

乾杯、リチャード

0
COSMO BAKER

すべて試してもまだこのエラーが発生する場合は、クラスファイルを最初から作成し直しますが、[XIBファイルも作成する]チェックボックスをオンにします。これは、これらのファイルを別々に作成するときにリンクされていないいくつかの項目を自動的にリンクアップします。これが作成された後、あなたはたぶん新しいXIBにすべてをカットアンドペーストすることができます、そしてそれはうまくいくはずです。

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

0
Travis M.