J'ai un segmentedControl 5 segment que je l'ai sous-classé en utilisant le code de cet article:UISegmentedControl décochée n'est pas reconnu dans le code même si elle est visuellement
How to deselect a segment in Segmented control button permanently till its clicked again
pour permettre au contrôleur d'être décochée lorsque le le segment sélectionné est touché une seconde fois.
Cela fonctionne visuellement, mais lorsque vous essayez d'attribuer un UserDefault, il est simplement reconnu comme le segment qui a été touché deux fois.
Je n'arrive pas à comprendre ce que je peux ajouter au code de la sous-classe ou au code viewController pour que cela fonctionne.
Toute aide serait appréciée.
CODE Sous-classe:
class mySegmentedControl: UISegmentedControl {
@IBInspectable var allowReselection: Bool = true
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let previousSelectedSegmentIndex = self.selectedSegmentIndex
super.touchesEnded(touches, with: event)
if allowReselection && previousSelectedSegmentIndex == self.selectedSegmentIndex {
if let touch = touches.first {
let touchLocation = touch.location(in: self)
if bounds.contains(touchLocation) {
self.sendActions(for: .valueChanged)
self.selectedSegmentIndex = UISegmentedControlNoSegment
}
}
}
}
}
CODE viewController:
@IBOutlet weak var METDome_L: UISegmentedControl!
let key_METDome_L = "METDome_L"
var METD_L: String!
@IBAction func METDome_Lselect(_ sender: Any) {
if METDome_L.selectedSegmentIndex == 0{
METD_L = "1"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 1{
METD_L = "2"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 2{
METD_L = "3"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 3{
METD_L = "4"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 4{
METD_L = "5"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else{
METD_L = "NONE"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
}
ne sont pas liés, mais vous pouvez remplacer le code entier ** ** dans 'METDome_Lselect' avec une ligne:' UserDefaults.standard.set ("\ (sender.selectedSegmentIndex + 1)", forKey: key_METDome_L) ' . Le dernier 'else' ne sera jamais exécuté de toute façon. En passant, ce n'est pas Javascript ou PHP. Les noms de variable sont supposés être * camelCased * plutôt que * snake_cased *. – vadian
Merci @vadian! Je savais qu'il devait y avoir un moyen de raccourcir le code, mais jamais pensé à le faire comme vous l'avez dit, ce qui est vraiment utile. Cependant, l'autre partie est le code dont j'ai vraiment besoin pour travailler. J'ai aussi essayé 'else si METDome_L.selectedSegmentIndex == UISegmentedControlNoSegment' mais je suppose que cela ne sera jamais exécuté. Sur la note des noms de variables, pour la plupart j'ai utilisé _camelCased_ Je viens d'utiliser le trait de soulignement pour séparer des parties de la variable pour la rendre plus facile à reconnaître car je suis relativement nouveau au codage et je peux facilement me perdre avec le montant de code. –
Je doute que le 'IBAction' est déclenché lorsque le contrôle est désélectionné par programmation. Vous pouvez déplacer la ligne pour écrire 'NONE' dans la sous-classe – vadian