[Résolu] Méthode générique pour UIButton
Bonjour,
je configure plein de champs en code, et donc plutôt que de répéter plusieurs fois les même commandes de configuration du champ, j'ai fait une fonction.
J'essaie de faire pareil pour des boutons, et là , ça se complique, dixit l'action avec plusieurs paramètres.
Le code pour les champs :
override func viewDidLoad() {
super.viewDidLoad()
confFields()
}
func confFields() {
confFieldsFunction(nomTextField)
confFieldsFunction(prenomTextField)
confFieldsFunction(dateCreationTextField)
confFieldsFunction(yeuxTextField)
confFieldsFunction(ageTextField)
}
func confFieldsFunction(leChamp: UITextField) {
leChamp.layer.cornerRadius = 5.0
leChamp.layer.borderWidth = 1
leChamp.layer.borderColor = BorderChampsColor
leChamp.attributedPlaceholder = NSAttributedString(string:leChamp.placeholder!,attributes: [NSForegroundColorAttributeName: FontColor])
}
Pour les bouton, ce sont des boutons sur lesquels, lorsque l'on clique, un petit popUp (pas un popOver Apple mais une UIView custom - class PopUpField: UIView { ....... } ) apparaà®t, et on choisit dans un des 2, ou 3, ou 4 labels du popUp.
Avant la tentative de création de la fonction pour éviter des dizaines de lignes de code recopiées, cela fonctionnait à merveille.
Voici donc ma tentative infructueuse (sur le modèle des champs - plus haut) :
Donc, évidemment avec un (confButtons()) dans le (viewDidLoad).
Je ne met le code que pour un bouton, pour ne pas surcharger.
func confButtons() {
labelsSexe = ["Masculin", "Féminin"]
popUpFieldSexe = PopUpField(frame: CGRectMake(boutonSexe.frame.origin.x + 60, boutonSexe.frame.origin.y - 33, 200, 110))
confButtonsFunction(boutonSexe, unPopUpField: popUpFieldSexe)
}
func confButtonsFunction(buttonEtape: UIButton, unPopUpField: PopUpField) {
buttonEtape.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left
buttonEtape.contentEdgeInsets = UIEdgeInsetsMake(0.0, 6.0, 0.0, 0.0)
buttonEtape.addTarget(self, action: "tapButton:unPopUpField:", forControlEvents: UIControlEvents.TouchUpInside)
buttonEtape.layer.cornerRadius = 5.0
buttonEtape.layer.borderWidth = 1
buttonEtape.layer.borderColor = BorderChampsColor
}
func tapButton(button: UIButton, unPopUpField: PopUpField) {
removePopUpFieldsEtape0()
unPopUpField.backgroundColor = UIColor.clearColor()
unPopUpField.nbreLabels = 2
viewMereEtape0.addSubview(unPopUpField)
configLabelsPopUpSexe()
}
func removePopUpFieldsEtape0() {
if popUpFieldSexe != nil {
popUpFieldSexe.removeFromSuperview()
label1Sexe.removeFromSuperview()
label2Sexe.removeFromSuperview()
}
}
Ben voilà , j'ai toujours "fatal error: unexpectedly found nil while unwrapping an Optional value"
J'ai vu pour le selector des trucs sympas que j'ai essayé ici.
En fait je galère.
Si quelqu'un a une idée, ce serait super.
Sans quoi, c'est pas grave, je répète mes lignes de code de configuration, mais ça fait pas très pro.
Merci d'avance.
Réponses
Est-ce que tu utilises le point d'arrêt automatique (exception breakpoint) du debugger, qui t'amène à la ligne où a lieu l'erreur ?
Merci colas_ pour ta réponse.
Oui, et il s'agit de (label1Sexe.removeFromSuperview()), mais je me suis mal exprimé dans mon post, parce que ça c'est pas grave, encore une histoire de nil et avec un "if let...", je devrais m'en sortir là -dessus.
Par contre, en mettant
en commentaires dans
j'ai le message d'erreur qui m'intéresse d'avantage. En fait, l'idée est que j'envoi deux paramètres à tapButton(), qui a besoin de récupérer le bouton cliqué (ça c'est ok) mais aussi le popUpField. C'est pourquoi, j'ai le truc avec la syntaxe des deux points, dans l'action.
Et j'ai donc le message d'erreur suivant, sur la ligne
Pas facile ces notions de selector...
Si tu utilisais Xcode pour connecter l'action au bouton, tu aurai vu les options.
Merci Joanna Carter.
Oui, j'ai vu ça dans des println, et je suis donc passé sur une autre technique, en mettant un tag sur chacun de mes boutons.
Voilà où j'en suis, je suis assez content d'avoir simplifié et économisé un paquet de lignes de code.
Et ça marche nickel.
Y'a juste un truc qui me chiffonne, c'est d'avoir été obligé de créer mes popUpFields avant de cliquer sur les boutons sensés les montrer. Mais je pense que ce n'est pas très grave.
Je vais mettre résolu, et je met mon petit bout de code si ça intéresse quelqu'un, même si je pense que ce n'est pas très intéressant.
J'ai créer des tableaux, ...
Merci à vous pour l'aide.