如何在 Swift 中创建自定义 UIControl 事件?

How to create a custom UIControlEvent in Swift?

我正在创建自定义 UI-Element 并希望触发自定义 UIControlEvent。我已经发现,有一个范围 ApplicationReserved.

遗憾的是这不起作用,因为它“不符合协议 'RawRepresentable':

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

两个问题:
1) 这是自定义事件的正确方法吗?
2) 如何正确定义自定义事件?

谢谢!

由于在 Swift 2.0 中 UIControlEvents 是作为 OptionSetType 的结构创建的,因此您可以用相同的方式创建自定义 UIControlEvents。

对于你的问题,

struct MyCustomEvents : OptionSetType{
    let rawValue : UInt

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

要向此自定义 UIControlEvent 添加 target/action,您需要将其转换为 UIControl 事件。

let controlEvent : UIControlEvents = UIControlEvents.init(rawValue: MyCustomEvents.Increase.rawValue)
sliderControl.addTarget(self, action: "increaseAction:", forControlEvents: controlEvent)

因为你想要的只是另一个UIControlEvent,你可以使用(和以前一样).applicationReserved定义的范围作为一个免费的space供你使用。不过,更正确、更易于使用的方法是:

(Swift 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 常量之间没有太大区别。

Swift 5

UIControlEvents 已重命名为 UIControl.Event


extension UIControl.Event {

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