如何在 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)
}
我正在创建自定义 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)
}