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.
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)!
}
}
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.
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
:
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!
É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:
La suppression de l'ancien chemin de clé a résolu le problème.
Dans les attributs d'exécution définis par l'utilisateur, utilisez layer.cornerRadius
au lieu de cornerRadius
.
Il semble que la valeur bool de keyPath
n'ait pas été définie sur true ou false. setKeyPath à true ou false!