web-dev-qa-db-fra.com

Impossible de définir () la propriété inspectée définie par l'utilisateur sur (UIButton)

Dans un ViewController simple, j'ai ajouté un UIButton. Je souhaite utiliser les "Attributs d'exécution définis par l'utilisateur". Pour l'instant, j'ai ajouté l'attribut Bool par défaut.

screen

Le bouton est un @IBOutlet:

@IBOutlet var button:UIButton!

Le lien dans le storyboard est terminé.

Je n'ai rien d'autre dans mon application.

J'ai eu cette erreur:

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.

Je ne comprends pas ce qui me manque.

EDIT 1

En suivant les conseils @timaktimak, j'ai créé une classe UIButton personnalisée:

@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

L'erreur est la même:

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

Eh bien, votre bouton n'a pas de propriété appelée keyPath pour le définir sur quelque chose.

Les attributs d'exécution définis par l'utilisateur sont utilisés pour définir simplement une valeur de propriété dans le générateur d'interface.

Vous pouvez utiliser une propriété standard que chaque UIButton possède, par exemple backgroundColor:

enter image description here

Ou, vous pouvez créer une sous-classe UIButton personnalisée, lui ajouter une propriété, puis définir la classe du bouton sur la sous-classe personnalisée créée et définir la valeur de la propriété dans la section Attributs d'exécution définis par l'utilisateur.

Vous pouvez consulter, par exemple, cette réponse, elle contient un exemple de classe personnalisée avec des attributs d'exécution définis par l'utilisateur: https://stackoverflow.com/a/24433125/3445458

Edit: assurez-vous que vous n'utilisez pas facultatif (ou implicitement déballé facultatif) pour le type, cela ne fonctionne pas avec les attributs d'exécution définis par l'utilisateur (je suppose car l'Interface Builder ne sait pas si la valeur peut être définie sur nil, et l'afficher dans les options ou non).

Donc tu ne peux pas faire

var keyPath: Bool!

à la place, vous ne pouvez faire

var keyPath: Bool = false

ou n'utilisez pas de valeur par défaut et définissez-la à la place dans le constructeur. Pour une raison quelconque, cela fonctionne avec un String facultatif (et dans l'exemple, ils utilisent un String facultatif), mais pas avec le Bool facultatif. Pour conclure, n'utilisez pas ou ne vous inquiétez pas trop des attributs d'exécution définis par l'utilisateur, il est plus clair de définir les valeurs par défaut dans le code!

J'espère que cela t'aides! Bonne chance!

31
timaktimak

Étant donné que ce fil est apparu environ 5 fois dans ma recherche d'une solution, je voulais publier mon correctif ici pour les futures âmes frustrées. La raison pour laquelle j'ai continué à obtenir cette erreur est que Interface Builder ne nettoie pas les anciennes propriétés IBInspectable si vous les expérimentez.

Dans mon cas, j'ai commencé avec une propriété Int appelée type et défini quelques boutons personnalisés sur mon écran pour utiliser une valeur de 3 comme test. Plus tard, je l'ai changé en un nom de propriété plus significatif et en ai fait une chaîne, puis j'en ai défini quelques-unes. Mais lorsque j'ai exécuté l'application, je recevais ce message.

Je n'ai découvert l'erreur que lorsque je suis allé à l'inspecteur d'identité et que j'ai remarqué que j'avais encore un ancien chemin de clé et une valeur utilisée pour certains des boutons:

enter image description here

La suppression de l'ancien chemin de clé a résolu le problème.

15
Justin Whitney

Dans les attributs d'exécution définis par l'utilisateur, utilisez layer.cornerRadius au lieu de cornerRadius.

1
Norman

Il semble que la valeur bool de keyPath n'ait pas été définie sur true ou false. setKeyPath à true ou false!

0
KkMIW