2016-03-30 32 views
3

我想知道是否有可能在Swift中編輯properties而通過extension編輯properties關於屬性的Swift擴展事件監聽器

我想做這樣的事情。

extension UIGestureRecognizer { 
    var state: UIGestureRecognizerState { 
     didSet(state) { 
      self.stateChanged(state) 
     } 
} 

回答

1

你不能改變UIGestureRecognizerstate財產的執行。如果您可以公開獲取並設置state,那麼您可以創建一個不同的計算屬性myState,它將轉發獲取並設置爲state。不幸的是,你不能。但是,您可以使用KVO(Key Value Observing)解決此問題。

首先,我們創建一個對象,該對象可以響應我們手勢的KVO通知,並實現observeValueForKeyPath,該對象在調用state屬性時調用。

class StateObserver : NSObject { 
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if let gesture = object as? UIGestureRecognizer { 
      gesture.stateChanged(gesture.state) 
     } 
    } 
} 

二,註冊StateObserver實例時tap.state改爲得到通知。

let stateObserver = StateObserver() 
let tap = UITapGestureRecognizer() 
tap.addObserver(stateObserver, forKeyPath: "state", options: [.New, .Old], context: nil) 

第三,不要忘記註銷StateObserver一旦你完成。

tap.removeObserver(stateObserver, forKeyPath: "state'") 
+0

您何時會刪除觀察者?例如,如果它在UITapGesture上,你會不會總希望在那裏多次點擊? –

+0

你是正確的,當你不再想接收通知時,你可以刪除觀察者。一個例子是當視圖出現在屏幕上時添加觀察者,當視圖被移除時刪除觀察者。 – Kevin