Как создать собственный UIControlEvent в Swift?

Я создаю настраиваемый элемент пользовательского интерфейса и хочу вызвать настраиваемое событие UIControlEvent. Я уже выяснил, что есть диапазон ApplicationReserved.

К сожалению, это не работает, потому что «не соответствует протоколу RawRepresentable»:

enum MyCustomEvents : UIControlEvents{
  case Increase = 0x01000000
  case Decrease = 0x02000000
}

Два вопроса:
1) Это правильный подход для пользовательских событий?
2) Как я могу правильно определить пользовательские события?

Спасибо!


person hendra    schedule 28.09.2015    source источник


Ответы (3)


Поскольку UIControlEvents создаются как структура OptionSetType в Swift 2.0, вы можете создавать собственные UIControlEvents таким же образом.

На ваш вопрос будет

struct MyCustomEvents : OptionSetType{
    let rawValue : UInt

    static let Increase = MyCustomEvents(rawValue: 0x01000000)
    static let Decrease = MyCustomEvents(rawValue: 0x02000000)
}

Для добавления цели/действия к этому пользовательскому событию UIControlEvent вам необходимо преобразовать его в событие UIControl.

let controlEvent : UIControlEvents = UIControlEvents.init(rawValue: MyCustomEvents.Increase.rawValue)
sliderControl.addTarget(self, action: "increaseAction:", forControlEvents: controlEvent)
person UditS    schedule 08.10.2015
comment
Подробнее о перечислениях битовой маски в стиле NS_Options см. в этом ответе: stackoverflow.com/questions/24066170/ - person UditS; 08.10.2015
comment
@ user3726405 : Пожалуйста, примите ответ, если он вам помог, или дайте мне знать, если у вас возникнут какие-либо проблемы. - person UditS; 12.10.2015
comment
это работает! Расширение от OptionsSetType имело значение. Спасибо - person hendra; 15.10.2015
comment
Можете ли вы написать, как вы можете вызвать это пользовательское действие «Увеличить» внутри пользовательского класса? - person RobbeR; 05.01.2016
comment
@UditS, как узнать, какие значения rawValue подходят для использования? Может ли 0x01000000 уже обозначать какое-то событие? - person igrek; 21.06.2018
comment
ааа, нашел документы .. поэтому отвечаю на свой вопрос: UIControlEventApplicationReserved = 0x0F000000, - person igrek; 21.06.2018
comment
так что, кажется, например, 15 событий - person igrek; 21.06.2018

Поскольку то, что вам нужно, это просто еще один UIControlEvent, вы можете использовать (как и раньше) диапазон, определенный .applicationReserved, как свободное пространство для использования. Хотя, более правильным и простым в использовании способом сделать это было бы:

(Свифт 3.0):

extension UIControlEvents {
    static var increased: UIControlEvents { return UIControlEvents(rawValue: 0b0001 << 24) }
    static var decreased: UIControlEvents { return UIControlEvents(rawValue: 0b0010 << 24) }
}

Таким образом, вы можете легко использовать эти определения везде, где предполагается использование событий, также с удобством вывода типа (например, sendActions(for: [.valueChanged, .increased])).

Объявление также выглядит чище для меня, так как эти биты легче увидеть, что они не пересекаются, используя сдвиг. Поскольку .applicationReserved определяется как 0b1111 << 24, то более определенно, какие его части вы используете.

Это может быть public, если необходимо, и нет большой разницы между вычислением var, как здесь, или просто присвоением let констант.

person DeFrenZ    schedule 29.01.2017
comment
Есть ли способ установить эти события управления, доступные в построителе интерфейса? - person General Failure; 19.07.2017

Свифт 5

UIControlEvents был переименован в UIControl.Event.


extension UIControl.Event {

    static var dismissed: UIControl.Event = UIControl.Event(rawValue: 0b0010 << 24)
}
person Fitsyu    schedule 13.06.2019