• 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,  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学习专题,与群同步,欢迎大家加入。贝尔特伦

    ---恢复内容结束---

  • 相关阅读:
    【前端优化之拆分CSS】前端三剑客的分分合合
    ipad&mobile通用webapp框架前哨战
    如何判断一个DOM元素正在动画,一个CSS“阻塞”JS的例子
    关于前端框架升级与全站样式替换的简单建议
    【HTML5&CSS3进阶04】CSS3动画应该如何在webapp中运用
    【HTML5&CSS3进阶03】Jser与Csser如何一起愉快的翻新老组件
    【HTML5&CSS3进阶学习02】Header的实现·CSS中的布局
    【HTML5&CSS3进阶学习01】气泡组件的实现
    【模块化编程】理解requireJS-实现一个简单的模块加载器
    【小贴士】探一探javascript中的replace
  • 原文地址:https://www.cnblogs.com/zxh-iOS/p/5185258.html
Copyright © 2020-2023  润新知