UIControlState.Normal недоступен

Раньше для экземпляров UIButton вы могли пройти UIControlState.Normal для setTitle или setImage. .Normal больше не доступен, что я должен использовать вместо этого?

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

(Это каноническая пара Q & A для предотвращения повторения повторяющихся вопросов, связанных с этими изменениями UIButton и UIControl с iOS 10 и Swift 3)

Ответ 1

Обновление Swift 3:

Похоже, что Xcode 8/Swift 3 привел UIControlState.normal назад:

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 был переименован в UIControlState.normal и удален из SDK iOS. Для параметров "Обычный" используйте пустой массив для создания пустого набора опций.

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: [])

Ответ 2

Удаляется .Normal (iOS 10 DP1), вы можете использовать [] или UIControlState(rawValue: UInt(0)) для замены .Normal, если вы не хотите менять коды повсюду (в случае добавления apple или вам не нравится []), вы можете просто добавить этот код

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

или

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

тогда все .Normal работают как раньше.

Ответ 3

Apple вернула нормальное состояние управления в более поздних версиях Xcode beta. Обновите последнюю бета-версию Xcode и используйте .normal.

Ответ 4

Swift 5

Заменить от

btn.setTitle("title", for: .Normal)

в

btn.setTitle("title", for: UIControl.State.normal)