2016-06-13 11 views
11

Wcześniej dla instancji UIButton można było przekazać UIControlState.Normal dla setTitle lub setImage. .Normal nie jest już dostępny, co powinienem zamiast tego użyć?UIControlState.Normal jest niedostępny

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

(to jest kanoniczny Q & Para aby zapobiec powodzi zduplikowanych pytania związane z tym UIButton i UIControl zmianach iOS 10 i Swift 3)

Odpowiedz

19

Swift 3 zmiana:

Wygląda na to, że Xcode 8/Swift 3 przyniósł UIControlState.normal wstecz:

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 został przemianowany na UIControlState.normal i usunięty z zestawu SDK iOS. W przypadku opcji "Normalne" użyj pustej tablicy, aby utworzyć pusty zestaw opcji.

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 '[]' jest z pewnością najczystszym i najbardziej oczywistym sposobem na zrobienie tego. Cieszę się, że Apple postanowił zrobić to z jakiegoś powodu. Mam nadzieję, że to tylko sprawa typu beta, ale tak nie wygląda. – Sirens

+1

Podczas korzystania z Xcode 8.1, konwerter nadaje 'UIControlState()' do podstawiania '.Normal'. –

+0

Uzupełnij umysł Apple !! normalny, lub .Normal ????? Jesteś bardziej dwubiegunowy niż mój były. – Josh

2

.Normal jest usuwany (iOS 10 DP1), można użyć [] lub UIControlState(rawValue: UInt(0)) zastąpić .Normal, jeśli nie chcesz zmieniać kody dookoła (w przypadku jabłek dodać go ponownie lub don „t lubi []), można po prostu dodać po tym kodzie

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

lub

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

następnie wszystkie .Normal działa jak poprzednio.

+0

Jeśli chcesz dodać te rozszerzenia, powinieneś mieć małe 'n', aby uruchomić' normal', aby pasowało do innych wartości, takich jak 'wyróżnione' i' wybrane'. –

+0

@GaryMakin Masz prawo, ale zapewniam to rozszerzenie facetowi, który nie chce "wymienić wszystkiego" w plikach. ponieważ oryginalny to '.Normal', więc trzymam go' N' nie 'n'. Myślę, że potrzebuję "n", po prostu wiedzą, jak to zmienić. To tylko przykład, a my wszyscy nie jesteśmy zwykłymi użytkownikami, prawda? – Galvin

+0

'UIControlState()' jest lepsze niż 'UIControlState (rawValue: UInt (0))'. Praktycznie "normalny" nie powinien być stanem, więc "normalny" jest usunięty. –

2

Apple przywrócił normalny stan kontroli w nowszych wersjach beta Xcode. Uaktualnij do najnowszej wersji beta Xcode i użyj .normal.

+0

Mimo że ten inicjator jest ujawniony przez 'OptionSetType', nie jestem pewien, czy zaleciłbym takie podejście. Osobiście uważam, że "[]" jest bardziej czytelne, ale jest to jednak ważne. – JAL