2016-06-13 47 views
11

In precedenza per UIButton istanze, è stato possibile passare in UIControlState.Normal per setTitle o setImage. .Normal non è più disponibile, cosa dovrei usare invece?UIControlState.Normal non è disponibile

let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) 
btn.setTitle("title", for: .Normal) // does not compile 

(Questa è una Q canonica & Un paio di impedire il flusso di domande duplicati associati a questa UIButton e UIControl cambiamenti con iOS 10 e Swift 3)

risposta

19

Swift 3 aggiornamento:

sembra che Xcode 8/Swift 3 portato UIControlState.normal indietro:

public struct UIControlState : OptionSet { 

    public init(rawValue: UInt) 


    public static var normal: UIControlState { get } 

    public static var highlighted: UIControlState { get } // used when UIControl isHighlighted is set 

    public static var disabled: UIControlState { get } 

    public static var selected: UIControlState { get } // flag usable by app (see below) 

    @available(iOS 9.0, *) 
    public static var focused: UIControlState { get } // Applicable only when the screen supports focus 

    public static var application: UIControlState { get } // additional flags available for application use 

    public static var reserved: UIControlState { get } // flags reserved for internal framework use 
} 

UIControlState.Normal è stato rinominato in UIControlState.normal e rimosso dall'SDK di iOS. Per le opzioni "Normali", usa un array vuoto per costruire un set di opzioni vuoto.

let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) 

// Does not work 
btn.setTitle("title", for: .Normal) // 'Normal' has been renamed to 'normal' 
btn.setTitle("title", for: .normal) // 'normal' is unavailable: use [] to construct an empty option set 

// Works 
btn.setTitle("title", for: []) 
+0

Mhmm '[]' è sicuramente il modo più pulito e più ovvio per farlo. Glad Apple ha deciso di farlo per qualche motivo/s. Spero che questa sia solo una cosa di tipo beta ma non sembra così. – Sirens

+1

Quando si utilizza Xcode 8.1, il convertitore fornisce 'UIControlState()' per sostituire '.Normal'. –

+0

Deciditi, Apple !! normale o normale ????? Sei più bipolare del mio ex. – Josh

2

Il .Normal viene rimosso (iOS 10 DP1), è possibile utilizzare il [] o UIControlState(rawValue: UInt(0)) per sostituire il .Normal, se non si desidera modificare i codici di tutto (nel caso in cui Apple Aggiungi nuovamente o don 't come il []), si può semplicemente aggiungere una volta che questo codice

extension UIControlState { 
    public static var Normal: UIControlState { return [] } 
} 

o

extension UIControlState { 
    public static var Normal: UIControlState { return UIControlState(rawValue: UInt(0)) } 
} 

poi tutto il .Normal funziona come prima.

+0

Se dovessi aggiungere quelle estensioni, dovresti avere un 'n' minuscolo per avviare' normal' in modo che corrisponda agli altri valori come 'evidenziato' e' selezionato'. –

+0

@GaryMakin Il tuo diritto, ma fornisco questa estensione per il ragazzo che non vuole "sostituire tutto" nei file. perché quello originale è '.Normal' quindi lo tengo' N' not 'n'. Penso che chi ha bisogno di "n" sappia solo come cambiarlo. Questo è solo un esempio e noi tutti non sviluppiamo utenti comuni, giusto? – Galvin

+0

'UIControlState()' è migliore di 'UIControlState (rawValue: UInt (0))'. In pratica, 'normal' non dovrebbe essere stato, quindi' normal' viene rimosso. –

2

Apple ha riportato lo stato di controllo normale nelle versioni più recenti di Xcode beta. Esegui l'upgrade alla versione più recente di Xcode beta e utilizza .normal.

+0

Sebbene questo inizializzatore sia esposto tramite 'OptionSetType', non sono sicuro di raccomandare questo approccio. Personalmente, penso che '[]' sia più leggibile, ma ciò è comunque valido. – JAL

Problemi correlati