Swift KVO相關

前言

在寫swift版的上下拉刷新缎罢,語法看了3個小時就開始動手了般眉,結果一路坑麻顶,先寫幾篇鋪墊的文章巷折,后續(xù)文章會附上上下拉刷新有關代碼遍略。

KVO

Swift對KVO支持可謂差到不行惧所,只能NSObject的子類進行監(jiān)聽,而對基本類型則不執(zhí)行绪杏,寫的時候踩了坑下愈,還不知道為什么,尷尬蕾久。下面記錄踩過的坑势似,提醒后來者。

起因是這樣僧著,我在畫一個貝塞爾曲線履因,想監(jiān)聽控制點的y坐標,結果我寫出下面代碼(下面例子沒有寫removeObserver方法盹愚,你們一定要記得寫哈):

public class SpringView: UIView {
    var pointY = 0.0
    let keyY   = "pointY"
    
    override public init(frame: CGRect) {
        super.init(frame: frame)
        addObserver(self, forKeyPath: keyY, options: [.old, .new], context: nil)
        pointY = 1.0
    }
    
    override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == keyY {
            print(pointY)
        }
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

呀搓逾?!為毛不走杯拐!就是因為pointY是基本類型霞篡,此處耽誤一個小時。改一改:

public class SpringView: UIView {
    dynamic var point = UIView()
    let keyY = "point.frame"
    
    override public init(frame: CGRect) {
        super.init(frame: frame)
        addObserver(self, forKeyPath: keyY, options: [.old, .new], context: nil)
        point.frame = CGRect(x: 10.0, y: 10.0, width: 3.0, height: 3.0)
    }
    
    override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == keyY {
            print(point.frame)
        }
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

這次監(jiān)聽了一個view的frame,妥端逼。值得注意的一點朗兵,在需要KVO的屬性前面要加上** dynamic**前綴,告訴編譯器這個是可能被動態(tài)調用的顶滩。上述代碼去掉dynamic一樣正常執(zhí)行余掖,這又是為什么?

這就得說說OC和Swift的不同之處了礁鲁,OC是動態(tài)語言盐欺,我們所謂的執(zhí)行方法, 實際上是發(fā)消息仅醇,而Swift可以靜態(tài)調用方法冗美。當繼承 NSObject 時,就認為是 Objective-C 的類析二,就按照 Objective-C 的方式處理粉洼。注意就算是繼承 NSObject节预,但將方法標記成私有 private,也是不能動態(tài)找到方法地址的属韧。所以安拟,上述代碼中,如果point是private的宵喂,不加dynamic就會報錯糠赦。

那么如何監(jiān)聽基本類型呢?各位自己想辦法锅棕,啊哈哈愉棱,給一篇文章供大家參考KVO

上述代碼中哲戚,我要監(jiān)聽的都是本類中的屬性奔滑,就真的拿基本類型的屬性沒招了么?那不行顺少,于是我有嘗試了下述方法朋其,還是回到最初情況:

public class SpringView: UIView {
    var pointY = 0.0 {
        didSet {
            print(pointY)
        }
     }
    
    override public init(frame: CGRect) {
        super.init(frame: frame)
        changePointY()
    }
    
    func changePointY() {
        pointY = 1.0
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Swift為我們提供了willSet和didSet兩種監(jiān)聽器,看名字都知道這是干嘛用的脆炎,就不細說了哈梅猿。注意一點,在構造器中直接為屬性賦值不會走聽器的秒裕,可以使用上圖代碼方法或者在監(jiān)聽器中使用KVC賦值袱蚓。

以上是我踩坑的經(jīng)過,希望能給大家一些幫助几蜻。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喇潘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梭稚,更是在濱河造成了極大的恐慌颖低,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧烤,死亡現(xiàn)場離奇詭異忱屑,居然都是意外死亡,警方通過查閱死者的電腦和手機暇昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門莺戒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人急波,你說我怎么就攤上這事从铲。” “怎么了幔崖?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵食店,是天一觀的道長。 經(jīng)常有香客問我赏寇,道長吉嫩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任嗅定,我火速辦了婚禮自娩,結果婚禮上,老公的妹妹穿的比我還像新娘渠退。我一直安慰自己忙迁,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布碎乃。 她就那樣靜靜地躺著姊扔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梅誓。 梳的紋絲不亂的頭發(fā)上恰梢,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音梗掰,去河邊找鬼嵌言。 笑死,一個胖子當著我的面吹牛及穗,可吹牛的內容都是我干的摧茴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埂陆,長吁一口氣:“原來是場噩夢啊……” “哼苛白!你這毒婦竟也來了?” 一聲冷哼從身側響起焚虱,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丸氛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后著摔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缓窜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年谍咆,在試婚紗的時候發(fā)現(xiàn)自己被綠了禾锤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摹察,死狀恐怖恩掷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情供嚎,我是刑警寧澤黄娘,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布峭状,位于F島的核電站,受9級特大地震影響逼争,放射性物質發(fā)生泄漏优床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一誓焦、第九天 我趴在偏房一處隱蔽的房頂上張望胆敞。 院中可真熱鬧,春花似錦杂伟、人聲如沸移层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观话。三九已至,卻和暖如春越平,著一層夾襖步出監(jiān)牢的瞬間匪燕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工喧笔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帽驯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓书闸,卻偏偏與公主長得像尼变,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浆劲,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫嫌术、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉牌借,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 前言 對于在飯圈遇到的一點事情的一點看法度气。不準,勿撕膨报。 之前的成都接機事件給我感覺就是滿城風雨盡襲來磷籍,但是我也不想...
    螢窗閱讀 292評論 0 1
  • 一 我身邊有太多走散了的情侶院领。 他們有的乍見之歡久處不厭,有的互相扶持幾年道了句再見够吩。 不管是哪一種比然,都一次一次更...
    阿嚏魚閱讀 440評論 6 6
  • 安裝mysql sudo yum install mysql mysql-server mysql-devel 安...
    cws閱讀 2,697評論 1 3