如何在Swift中创建自定义UIControlEvent?

hen*_*dra 3 custom-controls user-interaction ios uicontrolevents swift

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

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

enum MyCustomEvents : UIControlEvents{
  case Increase = 0x01000000
  case Decrease = 0x02000000
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

DeF*_*enZ 12

由于你想要的只是另一个UIControlEvent,你可以使用(就像你之前一样).applicationReserved作为可用空间定义的范围供你使用.但是,更正确和易于使用的方法是:

(Swift 3.0):

extension UIControlEvents {
    static var increased: UIControlEvents { return UIControlEvents(rawValue: 0b0001 << 24) }
    static var decreased: UIControlEvents { return UIControlEvents(rawValue: 0b0010 << 24) }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以轻松地在任何应该使用事件的地方使用此定义,同时还可以方便地使用类型推断(例如sendActions(for: [.valueChanged, .increased])).

声明对我来说也看起来更干净,因为这些位更容易看出它们通过使用移位而不相交.由于.applicationReserved定义为0b1111 << 24,您更明确地使用它的哪些部分.

public如果需要,可以使用这些,并且在var此处计算s或仅分配let常量之间没有太大区别.

  • 有没有办法在界面构建器中设置这些控件事件? (2认同)

Udi*_*itS 6

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

对于你的问题,它将是

struct MyCustomEvents : OptionSetType{
    let rawValue : UInt

    static let Increase = MyCustomEvents(rawValue: 0x01000000)
    static let Decrease = MyCustomEvents(rawValue: 0x02000000)
}
Run Code Online (Sandbox Code Playgroud)

要将目标/操作添加到此自定义UIControlEvent,您需要将其转换为UIControl事件.

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