2015-09-28 26 views
2

我正在创建一个自定义的UI元素,并且想要触发一个自定义的UIControlEvent。我已经发现,有一个范围ApplicationReserved。如何在Swift中创建自定义的UIControlEvent?

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

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

两个问题:
1)这是自定义事件的正确方法
2)?我怎样才能正确地定义自定义事件?

谢谢!

回答

4

由于UIControlEvents在雨燕2.0作为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) 
+0

有关NS_Options风格掩码枚举的详细信息,签这样的回答: http://stackoverflow.com/questions/24066170/how-to-create-ns-options-style-bitmask-enumerations-in-swift – UditS

+0

@ user3726405 :请接受答案,如果它帮助你,或让我知道,如果你遇到任何问题 – UditS

+0

这个作品!从OptionsSetType扩展做出了区别。谢谢 – hendra

3

既然你想要的只是另一个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,所以更确定你正在使用哪个部分。

这些可以public如果需要的话,而且也没有计算var就像这里,或只是分配let常数相差无几。

+0

有没有办法在界面构建器中设置这些控件事件? –

相关问题