本文介紹在 Swift 中 使用 KVO 時简烤,一些需要注意的事項剂邮,下面截取了兩段我自己在項目中使用的代碼。
self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self,
selector: "moveText", userInfo: nil, repeats: true)
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "appEnterForeground", name: nil, object: nil)
第一個是第一個定時器(NSTimer)横侦,第二個是一個頁面的監(jiān)聽事件挥萌。即,讓程序不斷地觀察現(xiàn)在的『某個狀態(tài)』枉侧,當(dāng)這個狀態(tài)符合某個條件時引瀑,就去執(zhí)行 Selector 中的代碼。比如榨馁,我們的界面中有一個讓用戶輸入年齡的 UITextField憨栽,然后我們可以觀察(監(jiān)聽),當(dāng)發(fā)現(xiàn)用戶在這里輸入『0』時,我們就給一個提示:『年齡至少為1』徒像。
簡單介紹完畢黍特,下面說注意事項。
<h3>1. private 關(guān)鍵字</h3>
最簡單的使用 Selector 的情況锯蛀,就是如上面所列出的灭衷,在 NSTimer 中寫 selector 為 "moveText",然后我們在同一個文件中旁涤,再相應(yīng)地寫一個
func moveText(){
// Your Code
}
就可以了翔曲。
然而如果你想把它聲明為一個 private func,即不希望其他文件調(diào)用這個函數(shù)劈愚,就會出現(xiàn)問題瞳遍,通俗地講:private 使得這個函數(shù)不能被『外部』調(diào)用,而 Selector 對它的調(diào)用菌羽,實際上就是一種『外部調(diào)用』掠械。
【解決方案】
KVO 是基于 KVC 和動態(tài)派發(fā)技術(shù)(Dynamic Dispatch)的,Swift 為了效率禁用了 Objective-C 中有的動態(tài)派發(fā)注祖。那么你把這個動態(tài)特性再加回來就可以了~
1.通過 @objc 關(guān)鍵字來使用動態(tài)特性
@objc private func moveText(){
// Your Code
}
2.通過 dynamic 關(guān)鍵字來讓這個函數(shù)擁有與 OC 中動態(tài)調(diào)用時相同的運行時特性(@objc 足矣猾蒂,這個一般用不上)
dynamic private func moveText(){
// Your Code
}
更多關(guān)于 dynamic 關(guān)鍵字的內(nèi)容可以參考:http://swifter.tips/kvo/
<h3>2. class 關(guān)鍵字</h3>
如果你想把這個函數(shù)聲明為 class func
class func moveText(){
// Your Code
}
則本文最開始的代碼中的 target 應(yīng)該由 self 換為 MyClass.self (假設(shè)這段代碼寫在名為 MyClass 的類中)
self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: MyClass.self,
selector: "moveText", userInfo: nil, repeats: true)
最后, 以上關(guān)鍵字是可以疊加使用的是晨,如果你愿意肚菠,可以寫成下面這樣:
@objc private class func moveText(){
// Your Code
}
我在 StackOverFlow 中的回答,及其它相關(guān):
http://stackoverflow.com/questions/28184350/4-questions-about-selectors-in-swift
如有謬誤罩缴,歡迎在評論中指出蚊逢。