独自のUIButton
- extendedクラスを作成して@IBDesignable
にすると、Interface Builderで次の2つのエラーが発生します。
ここに私のコードがあります:
import UIKit
@IBDesignable
class RandjeUIButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.backgroundColor = UIColor.blackColor()
}
}
OS X 10.11 beta 2のXcode 7 beta 2で作業しています(VMで実行中)
XcodeのInterface Builderでは、@IBDesignable
クラスの初期化子bothまたはneitherを実装して、IBで適切にレンダリングする必要があります。
required init(coder aDecoder: NSCoder)
を実装する場合は、init(frame: CGRect)
もオーバーライドする必要があります。そうしないと、Xcodeによってスローされるエラーに見られるように、「エージェントがクラッシュします」。
そのためには、クラスに次のコードを追加します。
override init(frame: CGRect) {
super.init(frame: frame)
}
私は同じ問題に出会い、この方法で解決しました:
エラー:IB Designables:自動レイアウトステータスの更新に失敗しました:エージェントがクラッシュしました
次に、Xcodeは問題の場所を通知します。私の場合、クラスの前にIBDesignable
をドロップします。
それから私はそれをきれいにして再構築し、エラーが消えました
Xcode 7.3では、上記の解決策はどれもうまくいきませんでしたが、この質問に対する受け入れられた答えはそうでした: IB Designablesのインスタンスのレンダリングに失敗しました
- プロジェクトのXcode派生データをクリアします。これらは〜/ Library/Developer/Xcode/DerivedDataにあります
- BuildKを押して現在のビルドをクリーンアップします
- プロジェクトを構築する
- ストーリーボードで[エディター]メニューに移動し、[すべてのビューを更新]を実行します。ビルドが完了するのを待ち、エラーがなくなるはずです
問題を解決するために4番目のステップを実行する必要はありませんでした(そして、PaintCode-drawRect'd UIViewをストーリーボードにペイントします)。
@ Mojtabaおよび@WeZZardへのクレジット
これを引き起こす可能性がある無数の問題があります。コンソールを起動し、クラッシュレポートIBDesignablesCocoaTouch...
を探します
valueForKey
のセマンティクスに問題があるサードパーティの設計可能なものに関する問題を整理しました。
私にとっては、#if !TARGET_INTERFACE_BUILDER
を使用していなかったからです。基本的に、バンドル内のパスにアクセスするコードがいくつかありました...
Bundle.main.path(forResource: "Foo", ofType: "plist")
問題は、(アプリではなく)IBで実行しているとき、Bundle.main
はアプリではないということです...
(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)
したがって、これに対する答えは、設計で実行するときに意味をなさないもの(たとえば、私の場合はCoreLocation
を呼び出す)に@IBDesignable UIView
コードを注意深く確認し、#if !TARGET_INTERFACE_BUILDER
を使用することです。時間。
これは、ストーリーボードでEditor -> Debug Selected View
を選択しているときに@IBDesignable UIView
を使用したときに表示されるものです。
私の場合、initXXXX
がassert
を実行していたことがわかりますが、設計時にクラッシュしていました。これは、設計時にBundleのファイルの値を探していたためです。
@IBDesignableとマークされたクラスでUIImageを使用するとき、何か重要なことがわかりました。従来のUIImage initはエージェントをクラッシュさせます。
let myImage = UIImage(named: String) // crash the agent
解決策は、UIImageの次のinitメソッドを使用することです。
let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)
作業コードの例:
let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))
Selfは、@ IBDesignableキーワードを使用したクラスです。 Xcode 9.4、Swift 4.1
XCode 10、Swift 4.2
答えを見つけました こちら
解決策は簡単でした。カスタムビュークラスのrequired init?(coder aDecoder: NSCoder)
メソッドでバンドルの解決方法を変更しました。
Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
に変更する必要がありました
let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
別のXcodeセットアップシステムでコードを再度開くだけです。私の場合、うまくいきました。
これは私がこの問題を解決する方法です:
import UIKit
@IBDesignable class TestView: UIView {
@IBOutlet weak var label: UILabel!
@IBInspectable var textLabel1: String? {
get {
return label.text
}
set {
label.text = newValue
}
}
// MARK: Setup
var view1: UIView!
var nibName: String = "TestView"
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
private func xibSetup() {
view1 = loadViewFromNib()
view1?.frame = self.bounds
view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
if view1 != nil {
addSubview(view1!)
//textLabel1 = "ok"
}
}
private func loadViewFromNib() -> UIView? {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
for object in nib.instantiateWithOwner(self, options: nil) {
if let view: UIView = object as? UIView {
return view
}
}
return nil
}
}
使用法: