web-dev-qa-db-ja.com

(UIButton)でユーザー定義の検査済みプロパティを設定できませんでした()

単純なViewControllerに、1つのUIButtonを追加しました。 「ユーザー定義のランタイム属性」を使用したいと思います。今のところ、デフォルトのBool属性を追加しました。

screen

ボタンは@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)!
    }
}

screen2

エラーは同じです:

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.
8
cmii

さて、ボタンにはkeyPathという名前のプロパティがありません。

ユーザー定義のランタイム属性は、Interface Builderでプロパティ値を設定するために使用されます。

すべてのUIButtonが持つ標準プロパティを使用できます。たとえば、backgroundColor

enter image description here

または、カスタムUIButtonサブクラスを作成してプロパティを追加し、作成したカスタムサブクラスにボタンのクラスを設定して、ユーザー定義のランタイム属性セクションでプロパティ値を設定できます。

たとえば、この回答には、ユーザー定義のランタイム属性を持つカスタムクラスの例が含まれています: https://stackoverflow.com/a/24433125/3445458

編集:タイプにオプション(または暗黙的にアンラップされたオプション)を使用していないことを確認してください。ユーザー定義のランタイム属性では機能しません(推測Interface Builderは値をnilに設定できるかどうかを知らないため、オプションに表示するかどうかを判断します)。

だからできない

var keyPath: Bool!

代わりにできることは

var keyPath: Bool = false

または、デフォルト値を使用せず、代わりにコンストラクターで設定します。何らかの理由で、オプションのStringで機能しますが(例ではオプションのStringを使用します)、オプションのBoolでは機能しません。結論として、ユーザー定義のランタイム属性を使いすぎたり心配したりしないでください。コードでデフォルト値を設定する方が明確です!

お役に立てれば!幸運を!

31
timaktimak

このスレッドはソリューションの検索で約5回出てきたので、将来のイライラした魂のために修正をここに投稿したいと思いました。このエラーが引き続き発生するのは、Interface Builderが古いIBInspectableプロパティを試している場合、それらをクリーンアップしないためです。

私の場合、typeと呼ばれるIntプロパティで開始し、画面にいくつかのカスタムボタンを設定して、テストとして値3を使用しました。後で、より意味のあるプロパティ名に変更し、文字列にしてから、それらのいくつかを設定しました。しかし、アプリを実行すると、このメッセージが表示されていました。

Identity Inspectorにアクセスして、いくつかのボタンで使用されている古いキーパスと値がまだあることに気付くまで、エラーを発見しませんでした。

enter image description here

古いキーパスを削除すると、問題が修正されました。

15
Justin Whitney

ユーザー定義のランタイム属性では、cornerRadiusの代わりにlayer.cornerRadiusを使用します。

1
Norman

keyPath bool値をtrueまたはfalseに設定できなかったようです。 setKeyPathをtrueまたはfalseに!

0
KkMIW