この( 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では問題ありません。同じコードを使用します。
何か案は?ありがとうございました
投稿するloadViewFromNib()
メソッドは問題なく見えます。バンドルを正しく取得し、nib名を文字列リテラルとして指定しているため、nibを見つける必要があります。他の誰かがコメントしたように、代わりにあなたのペン先のセットアップにおそらく何か問題があります。確認することがいくつかあります。
AdvancedCellView
をファイルの所有者カスタムクラスとして設定する必要があります。N.B.この回答は、OPがリンクしているチュートリアルに関連しており、ペン先を設定するための正しい方法だけではありません。
instantiateWithOwner(options:)
メソッドはビューではなく配列を返すため、UIView
への強制ダウンキャストは機能しません。代わりに、実際の型[AnyObject]
にキャストしてみてください。
配列の要素はnibファイルの最上位のオブジェクトに対応するため、関心のあるビューは配列要素の1つである必要があります。 nibファイルの名前を指定すると、おそらく、配列内に最上位のオブジェクトが1つしかありません-ロードしようとしているセルです。 nibファイルに最上位のオブジェクトが1つだけあり、それが実際にUIView
のサブクラスのインスタンスであることを確認してください。
実装が潜在的に非効率的であることに注意してください。複数のセルを読み込む場合は、毎回新しいセルを作成するのではなく、UINib
インスタンスをキャッシュする必要があります。 UITableViewController
などのフレームワーククラスには、これらの詳細を自動的に処理するnibを登録するための組み込みメソッドがあるため、実際にこれを自分で行う必要はないことに注意してください。
代わりにこれを試してください。常に私のために働く:
let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil)
let view = picker[0] as! UIView
return view
うまくいくか教えてください