web-dev-qa-db-ja.com

nibからのインスタンス化されたビューがエラーをスローする

この( link )チュートリアルに従って@IBDesignable UIViewサブクラスを作成しようとしました。最初のカスタムビューはうまくいきます。しかし、別のものを作ろうとすると、エラーが発生します。最初に_failed to update auto layout status: the agent crashed_と_Failed to render instance of ..._を取得しました。どういうわけか、これらのエラーでプロジェクトをビルドして実行できるようになりましたが、新しいエラー-_EXC_BAD_ACCESS ..._がlet view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView行に表示されます。ここにメソッド全体があります:

_func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "advancedCellView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }
_

最初のカスタムUIViewでは問題ありません。同じコードを使用します。

enter image description here

何か案は?ありがとうございました

20
Lachtan

投稿するloadViewFromNib()メソッドは問題なく見えます。バンドルを正しく取得し、nib名を文字列リテラルとして指定しているため、nibを見つける必要があります。他の誰かがコメントしたように、代わりにあなたのペン先のセットアップにおそらく何か問題があります。確認することがいくつかあります。

  1. Identity InspectorでAdvancedCellViewをファイルの所有者カスタムクラスとして設定する必要があります。
  2. モジュールが正しいことも確認してください。通常は空白のままにします。
  3. ビューのカスタムクラスは設定しないでください。デフォルト(UIView)のままにしてください。サイドバーの「表示」よりもわかりやすい名前を付けている場合は、おそらく間違っています。
  4. Nibに最上位オブジェクトが1つしかないことを確認してください。ビューツリーを折りたたむと、サイドバーは次のようになり、他のエントリはなくなります。

Nib hierarchy with only one top level view

N.B.この回答は、OPがリンクしているチュートリアルに関連しており、ペン先を設定するための正しい方法だけではありません。

43
Josh Heald

私はチュートリアルを見ていて、カスタムxibのView要素をサブクラス化するとエラーが発生することを発見しました。 「ファイルの所有者」のみをカスタムクラスに設定していることを確認してください。

enter image description here

3
B-Rad

instantiateWithOwner(options:)メソッドはビューではなく配列を返すため、UIViewへの強制ダウンキャストは機能しません。代わりに、実際の型[AnyObject]にキャストしてみてください。

配列の要素はnibファイルの最上位のオブジェクトに対応するため、関心のあるビューは配列要素の1つである必要があります。 nibファイルの名前を指定すると、おそらく、配列内に最上位のオブジェクトが1つしかありません-ロードしようとしているセルです。 nibファイルに最上位のオブジェクトが1つだけあり、それが実際にUIViewのサブクラスのインスタンスであることを確認してください。

実装が潜在的に非効率的であることに注意してください。複数のセルを読み込む場合は、毎回新しいセルを作成するのではなく、UINibインスタンスをキャッシュする必要があります。 UITableViewControllerなどのフレームワーククラスには、これらの詳細を自動的に処理するnibを登録するための組み込みメソッドがあるため、実際にこれを自分で行う必要はないことに注意してください。

2
jlehr

代わりにこれを試してください。常に私のために働く:

let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil)
let view = picker[0] as! UIView

return view

うまくいくか教えてください

1
brl214