Swift中KVO(監聽)的使用方法及注意事項


---恢復內容開始---

     相信研究swift語言的開發者都多多少少了解或者精通Objective—C語言,熟練掌握Objective—C語言的開發者,在學習swift語言的過程中,是比較快速,而又輕松的。本人就是一位熟練掌握OC語言,后開始研究的swift。在學習swift語言的過程中,筆者建議有OC基礎的開發者,在寫swift的代碼過程中,再寫一下OC中的代碼,二者相互比較,相信你能找到快速學會swift語言的方法。資深,有耐心和有天賦的開發者,相信能在一周左右,能夠運用swift開發項目。其中消耗的時間,也只是個別地方的學習,了解並注意。

   我這次寫的是swift中的監聽即KVO的用法,一開始我是先寫成OC的代碼,然后轉化成swift的代碼的。在轉化過程中發現一些問題,費了一定時間去研究,去思考,去找資料。一下是swift中KVO中所需要注意的問題(僅個人測試所總結的,代碼有不對之處望指正,期望共同交流)。

   1,在寫swift的KVO的過程中,其不能監聽基本數據類型的屬性,若想監聽需將其改成NSNumber類型,或其它類型,否則監聽的代理方法不走。

   2,在寫swift的KVO的過程中,被監聽的屬性必須用“dynamic”修飾,否則監聽的代理方法不走。

   3,在寫swift的KVO的過程中,要保證監聽者和被監聽者同時存在(考慮到其生命周期)。

   4,在寫swift的KVO的過程中,要確保最后移除觀察者,防止內存泄露。

 

以下是代碼部分

 ViewController.swift頁面

//
//  ViewController.swift
//  swift監聽的用法
//
//  Created by mac on 16/2/6.
//  Copyright © 2016年 ZY. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var btn: UIButton!
    var _view1:NewView!;
    var myObject:MyNSObject!;
    var age:Int!;
    //myContext的作用,主要是區分監聽對象,具體作用,科自己上網查閱資料
    private var myContext = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        btn.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside);
        
        _view1 = NewView(frame: CGRectMake(100,50,100,100));
        _view1.backgroundColor = UIColor.orangeColor();
        self.view.addSubview(_view1);
        
        
        myObject = MyNSObject();
        _view1.addObserver(self, forKeyPath: "age", options: NSKeyValueObservingOptions.New, context: &myContext);

//        self.myObject.data = NSDate();
        
            self._view1.data = NSDate();
     
        age = 10;
    }

    func buttonAction(btn : UIButton){
    
        age = age + 10;

        let num = NSNumber(integerLiteral: age);
        
        self._view1.age = num;
        
    }
  
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        
        
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated);
        //移除監聽
        self.removeObserver(self, forKeyPath: "age", context: &myContext);
        
    }
    
}

 

 NewView.swift頁面

//
//  NewView.swift
//  swift監聽的用法
//
//  Created by mac on 16/2/6.
//  Copyright © 2016年 ZY. All rights reserved.
//

import UIKit

class NewView: UIView {
// 懶加載
//    lazy var label:UILabel = {
//        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 40))
//        return label
//    }()
   
    
    
//注解,,,使用監聽的時候,基本數據類型,不能作為監聽的屬性對象,且前面必須用dynamic修飾
    dynamic var age : NSNumber!;
   
    dynamic var data = NSDate();
    
    override init(frame: CGRect) {
        
        super.init(frame: frame);
        

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


}

移除監聽,在使用中沒有
dealloc方法,可以使用deinit方法替代
Swift技術交流群,512847147,同時Swift學習專題,與群同步,歡迎大家加入。貝爾特倫

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM