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

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


person JAL    schedule 13.06.2016    source источник


Ответы (4)


arrow_upward
22
arrow_downward

Обновление Свифт 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 и удален из iOS SDK. Для «Обычных» параметров используйте пустой массив для создания пустого набора параметров.

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: [])
person JAL    schedule 13.06.2016
comment
Mhmm [], безусловно, самый чистый и очевидный способ сделать это. Рад, что Apple по какой-то причине решила это сделать / с. Я надеюсь, что это всего лишь бета-версия, но это не похоже на это. - person Allison; 04.07.2016
comment
При использовании Xcode 8.1 преобразователь дает UIControlState() вместо .Normal. - person DawnSong; 23.11.2016
comment
Решайся, Яблоко!! нормальный или .Нормальный????? Ты более биполярен, чем мой бывший. - person Josh; 09.05.2017
comment
Я уже 5-й час перевожу этот проект с Swift 2 на 3. Если есть разумная мысль перестроить весь код с нуля, то вы облажались. невероятный. Это было бы даже неплохо, если бы они разрешили поддержку swift 2 в своем последнем xcode. - person Tim Nuwin; 24.07.2017
comment
@JAL Одна неделя для конверсии не страшна! - person Tim Nuwin; 24.07.2017

arrow_upward
2
arrow_downward

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

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

or

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

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

person Galvin    schedule 14.06.2016
comment
Если вы должны были добавить эти расширения, у вас должна быть строчная буква n, чтобы начать normal, чтобы соответствовать другим значениям, таким как highlighted и selected. - person Gary Makin; 19.06.2016
comment
@GaryMakin Вы правы, но я предоставляю это расширение для парня, который не хочет replace all в файлах. потому что исходный номер .Normal, поэтому я оставлю его N, а не n. Я думаю кому надо n они просто умеют его менять. Это всего лишь пример, и мы все разработчики, а не обычные пользователи, верно? - person Galvin; 20.06.2016
comment
UIControlState() лучше, чем UIControlState(rawValue:UInt(0)). На практике normal не должно быть состояния, поэтому normal удаляется. - person DawnSong; 23.11.2016

arrow_upward
2
arrow_downward

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

person ThePringle    schedule 22.06.2016
comment
Хотя этот инициализатор доступен через OptionSetType, я не уверен, что рекомендую этот подход. Лично я думаю, что [] более читабелен, но, тем не менее, это действительно так. - person JAL; 23.06.2016

arrow_upward
1
arrow_downward

Свифт 5

Заменить из

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

to

btn.setTitle("title", for: UIControl.State.normal)
person Jerry Chong    schedule 24.07.2019