【问题标题】:How to create a custom UIControlEvent in Swift?如何在 Swift 中创建自定义 UIControlEvent?
【发布时间】:2015-12-25 12:09:58
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: ios swift custom-controls user-interaction uicontrolevents


    【解决方案1】:

    由于您想要的只是另一个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 &lt;&lt; 24,因此您使用的部分更明确。

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

    【讨论】:

    • 有没有办法在界面生成器中设置这些控件事件?
    【解决方案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 添加目标/动作,您需要将其转换为 UIControl 事件。

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

    【讨论】:

    • 有关 NS_Options 样式位掩码枚举的详细信息,请查看此答案:stackoverflow.com/questions/24066170/…
    • @user3726405 :如果对您有帮助,请接受答案,如果您遇到任何问题,请告诉我
    • 这行得通!从 OptionsSetType 扩展有所不同。谢谢
    • 您能写出如何从自定义类中触发此自定义“增加”操作吗?
    • @UditS,你怎么知道哪些rawValue 值可以使用? 0x01000000 可能已经代表某些事件了吗?
    【解决方案3】:

    斯威夫特 5

    UIControlEvents 已重命名为 UIControl.Event

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2018-08-15
      • 2016-10-20
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多