5

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

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

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

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

谢谢!

4

3 回答 3

14

由于您想要的只是另一个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,因此更确定您正在使用它的哪些部分。

如果需要,可以使用这些,并且像这里这样计算 s 或仅分配常量public之间没有太大区别。varlet

于 2017-01-29T17:01:35.687 回答
6

由于在 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 添加目标/操作,您需要将其转换为 UIControl 事件。

let controlEvent : UIControlEvents = UIControlEvents.init(rawValue: MyCustomEvents.Increase.rawValue)
sliderControl.addTarget(self, action: "increaseAction:", forControlEvents: controlEvent)
于 2015-10-08T07:35:16.577 回答
1

斯威夫特 5

UIControlEvents 已重命名为 UIControl.Event


extension UIControl.Event {

    static var dismissed: UIControl.Event = UIControl.Event(rawValue: 0b0010 << 24)
}
于 2019-06-13T16:11:35.483 回答