単純なViewControllerに、1つのUIButtonを追加しました。 「ユーザー定義のランタイム属性」を使用したいと思います。今のところ、デフォルトのBool属性を追加しました。
ボタンは@IBOutletです。
@IBOutlet var button:UIButton!
ストーリーボードのリンクが完了しました。
アプリには他に何もありません。
私はこのエラーを受け取りました:
2017-03-26 20:31:44.935319+0200 ISAMG[357:47616] Failed to set (keyPath) user defined inspected property on (UIButton):
[<UIButton 0x15e3a780> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.
何が欠けているのか理解できません。
編集1
@timaktimakのアドバイスに従って、カスタムUIButtonクラスを作成しました。
@IBDesignable
class ChoiceButton: UIButton {
@IBInspectable var keyPath: Bool! {
didSet {
print("didSet viewLabel, viewLabel = \(self.keyPath)")
}
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
}
エラーは同じです:
2017-03-26 22:32:27.389126+0200 ISAMG[429:71565] Failed to set (keyPath) user defined inspected property on (ISAMG.ChoiceButton):
[<ISAMG.ChoiceButton 0x14e8f040> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.
さて、ボタンにはkeyPath
という名前のプロパティがありません。
ユーザー定義のランタイム属性は、Interface Builderでプロパティ値を設定するために使用されます。
すべてのUIButton
が持つ標準プロパティを使用できます。たとえば、backgroundColor
:
または、カスタムUIButton
サブクラスを作成してプロパティを追加し、作成したカスタムサブクラスにボタンのクラスを設定して、ユーザー定義のランタイム属性セクションでプロパティ値を設定できます。
たとえば、この回答には、ユーザー定義のランタイム属性を持つカスタムクラスの例が含まれています: https://stackoverflow.com/a/24433125/3445458
編集:タイプにオプション(または暗黙的にアンラップされたオプション)を使用していないことを確認してください。ユーザー定義のランタイム属性では機能しません(推測Interface Builderは値をnilに設定できるかどうかを知らないため、オプションに表示するかどうかを判断します)。
だからできない
var keyPath: Bool!
代わりにできることは
var keyPath: Bool = false
または、デフォルト値を使用せず、代わりにコンストラクターで設定します。何らかの理由で、オプションのString
で機能しますが(例ではオプションのString
を使用します)、オプションのBool
では機能しません。結論として、ユーザー定義のランタイム属性を使いすぎたり心配したりしないでください。コードでデフォルト値を設定する方が明確です!
お役に立てれば!幸運を!
このスレッドはソリューションの検索で約5回出てきたので、将来のイライラした魂のために修正をここに投稿したいと思いました。このエラーが引き続き発生するのは、Interface Builderが古いIBInspectableプロパティを試している場合、それらをクリーンアップしないためです。
私の場合、type
と呼ばれるIntプロパティで開始し、画面にいくつかのカスタムボタンを設定して、テストとして値3を使用しました。後で、より意味のあるプロパティ名に変更し、文字列にしてから、それらのいくつかを設定しました。しかし、アプリを実行すると、このメッセージが表示されていました。
Identity Inspectorにアクセスして、いくつかのボタンで使用されている古いキーパスと値がまだあることに気付くまで、エラーを発見しませんでした。
古いキーパスを削除すると、問題が修正されました。
ユーザー定義のランタイム属性では、cornerRadius
の代わりにlayer.cornerRadius
を使用します。
keyPath
bool値をtrueまたはfalseに設定できなかったようです。 setKeyPathをtrueまたはfalseに!