p.a.'s answer, convertito per Xcode 9, Swift 4.
L'idea è che i punti salienti .done
stile - o grassetto, a Swift 4 - il testo del pulsante.
inizializzare l'elemento pulsante in uno stato non evidenziati
let toggleButtonItem = UIBarButtonItem(title: "MyButton",
style: .plain,
target: self,
action: #selector(doSomething))
Toggle l'elemento pulsante a uno stato evidenziato utilizzando un ternario operatore, in questo modo:
toggleButtonItem.style = (toggleButtonItem.style == .plain) ?
toggleButtonItem.style = .done : toggleButtonItem.style = .plain
Oppure, in alternativa, , imposta lo stato di evidenziazione con una regolare affermazione if/else
in questo modo:
if toggleButtonItem.style == .plain {
toggleButtonItem.style = .done
}
else {
toggleButtonItem.style = .plain
}
E, per impostare un valore booleano per controllare se l'elemento pulsante è evidenziato:
var isHighlighted: Bool = (toggleButtonItem.style == .done)
Note:
- Lo stile
bordered
è stata sconsigliata a iOS 8, quindi ho usato .plain
qui invece. Entrambi presentano il testo dell'articolo pulsante in uno stato non illuminato.
La funzione #selector
deve essere un @IBAction
o deve essere preceduta da @objc
, per evitare problemi di "inferenza in Objective-C". Per esempio:
@objc func doSomething() { ... }
o, se è stato collegato un'azione alla voce tasto:
@IBAction func doSomething() { ... }
Entrambe queste dichiarazioni di funzioni dire al compilatore che stanno utilizzando la funzionalità di Objective-C-based . Questo è necessario perché #selector
è una cosa Objective-C sotto il cofano, e in Swift 4 devi dichiararlo, piuttosto che lasciare il compilatore dedurre cosa sta succedendo come ha fatto in precedenza.
Ciao Michael, hai qualche codice di esempio sull'utilizzo di un customView in UIBarButtonItem? Ho provato a implementarlo ma ho finito con un rettangolo nero in cui lo volevo trasparente. Eventuali suggerimenti? – Ckoeny
Ho risolto il problema utilizzando UIImageView come customView. impostare userInteractionEnabled su TRUE. – Ckoeny