2015-09-28 73 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

有沒有辦法在界面構建器中設置這些控件事件? –

相關問題