Question Swift: Comment implémenter les attributs d'exécution définis par l'utilisateur


Donc, je suis en train d'implémenter une barre d'outils personnalisée "chooser", comme l'équivalent iOS d'un ensemble de boutons radio (UISegmentedControl). Juste une barre horizontale divisée en options.

Pour ce faire, j'ai créé une sous-classe de UIControl appelé SegmentedControl et implémenté le dessin personnalisé. Cependant, avec une telle vue, j'ai besoin de l'option pour définir quelles sont les options disponibles. J'aurais juste pu accéder à la vue depuis le contrôleur viewDidLoad() et définissez-les, mais j'aime bien utiliser le générateur d'interface pour ce genre de choses.

J'ai donc découvert cette merveilleuse chose appelée "Attributs d'exécution définis par l'utilisateur". J'ai créé un String attribut avec une clé buttonValues et définir une valeur (c'est un simple sélecteur Homme / Femme, donc je suis allé avec "Homme | Femme"). J'ai découvert que vous pouvez accéder à ces valeurs en utilisant la fonction self.valueForKey() et passez la clé. J'ai fait un analyseur pour transformer cette chaîne en un tableau et ensuite ajouté des fonctionnalités pour le drawRect() fonction d'utiliser le tableau pour configurer les boutons.

Lorsque j'ai exécuté l'application, j'ai reçu une erreur à propos de "Conformité du codage des valeurs clés".

J'ai donc cherché ça et j'ai découvert que la classe devait avoir des variables de sauvegarde pour stocker les attributs. Si bien, j'ai ajouté une variable d'instance appelée buttonValues et initialisé à "". Maintenant, l'application fonctionne bien mais la valeur sort vide du self.valueForKey() fonction. J'ai recherché des didacticiels sur la configuration des attributs d'exécution définis par l'utilisateur, mais ils ne sont pas suffisamment détaillés. Ils parlent de la conformité au codage des valeurs-clés, comme si c'était quelque chose que je devais savoir.

Je voudrais savoir exactement ce que je dois faire pour que cela fonctionne correctement, en détail.


15
2018-06-26 08:01


origine


Réponses:


Pour vos besoins, vous pouvez utiliser des attributs d'exécution définis par l'utilisateur ou exposer votre classe et vos propriétés comme modifiables dans Interface Builder. Quoi qu’il en soit, vous voudrez déclarer vos propriétés comme des variables optionnelles IBOutlets sont créés de la même manière. Si vous devez apporter d’autres modifications une fois que vos propriétés ont une valeur, donnez-leur didSet observateurs immobiliers. Les propriétés seront à leur valeur par défaut lors de l'initialisation (ou nil si aucune valeur par défaut n'a été définie) et définie lorsque la vue est ajoutée à une vue supérieure.

Attributs d'exécution définis par l'utilisateur

Cela fonctionne plus ou moins comme vous l'avez décrit ci-dessus - voici la version la plus simple:

class LabeledView : UIView {
    var viewLabel: String! {
    didSet {
        println("didSet viewLabel, viewLabel = \(self.viewLabel)")
    }
    }

    init(coder aDecoder: NSCoder!)  {
        super.init(coder: aDecoder)
        println("init with coder, viewLabel = \(self.viewLabel)")
    }
}

Ensuite, réglez le viewLabel attribuer à "Bonjour" dans la vue de votre storyboard, comme ceci:

Xcode panel showing user-defined runtime attributes

Lorsque vous créez et exécutez, la console indique que la propriété est définie correctement:

init with coder, viewLabel = nil
didSet viewLabel, viewLabel = Hello

@IBDesignable & @IBInspectable

Cela donne à votre vue personnalisée une interface beaucoup plus agréable dans IB - définissez la @IBDesignable attribut sur votre classe et @IBInspectable attributs sur chaque propriété. Voici la même classe:

@IBDesignable class LabeledView : UIView {
    @IBInspectable var viewLabel: String!

    init(coder aDecoder: NSCoder!)  {
        super.init(coder: aDecoder)
    }
}

Vous pouvez maintenant définir vos propriétés inspectables en haut de l'inspecteur d'attributs dans Interface Builder:

Attributes Inspector with inspectable property


17
2018-06-26 14:25