美文网首页iOS Developer
Swift3.0 KVO/KVC/通知的应用

Swift3.0 KVO/KVC/通知的应用

作者: 小明2021 | 来源:发表于2017-06-12 18:00 被阅读389次

写作初衷:看了好多关于KVC/KVO/通知的相关文章,发现都是讲理论,并且不太好理解,更不太好应用到自己的项目中。我自己总结了下它们三个,分别附了一个例子,希望对大家有所帮助~

一、KVC:Swift中使用KVC和KVO的类都必须必须继承自NSObject

iOS很多UI控件会有很多隐藏的属性,但是这些属性,我们是可以通过kvc方式用的,不会被苹果拒绝,善于使用隐藏的属性,可以提高开发效率,其实kvc也是基于runtime实现的。

查看隐藏属性的方式:

一:可以通过runtime打印出所有的隐藏属性。
二:也可以用打断点的方式,在调试区查看UI控件的隐藏属性

// 用runtime的方式打印出所有UITextView的属性
unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([UITextView class], &count);
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];

        NSLog(@"UITextView-属性名:-->%s------%s", ivar_getName(ivar));
    }

kvc方式给对象的隐藏属性赋值:

        textField.placeholder = "请输入名字"
// forKey: 不支持属性的属性。最好用下面的方法:forKeyPath:
// textField.setValue(UIColor.red, forKey: "_placeholderLabel.textColor")
这句会报错:'[<UITextField 0x105bdf2a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key _placeholderLabel.textColor.' 
// 正确的方式:
 textField.setValue(UIColor.red, forKeyPath: "_placeholderLabel.textColor")
备注:即使是forKeyPath的方式,里面的属性也不能写一个没有的属性,否则还是会崩溃。:invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
libc++abi.dylib: terminate_handler unexpectedly threw an exception

二、KVO: 当被观察者的对象的属性被修改的时候,会通知观察者,KVC是KVO的基础
        // WKWebView监听title (webView初始化的地方监听)
        webView.addObserver(self, forKeyPath: "title", options: .new, context: nil)

     // 监听title的回调
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if (keyPath == "title") {
                self.addTitle(titleString: self.webView.title!)
        }
    }
    
    deinit { // 必须在页面销毁的时候,remove
        webView.removeObserver(self, forKeyPath: "title")
    }

三、通知:需要被观察者主动发送通知,然后观察者注册监听,比KVO多了发送通知的一步。优点是:监听不局限属性的变化,可以对多种多样的状态变化进行监听,范围广,灵活。
    // 触发通知的地方:
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTagDic object:dic];
    // 接收到通知的地方:
    [[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kNotificationTagDic object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(id x) {
        NSDictionary *dic = [x object];
        if (dic && [dic isKindOfClass:[NSDictionary class]] && dic.count > 0) {
              
        }
    }];

相关文章

  • KVC KVO高阶应用

    KVC KVO高阶应用 KVC KVO高阶应用

  • Swift3.0 KVO/KVC/通知的应用

    写作初衷:看了好多关于KVC/KVO/通知的相关文章,发现都是讲理论,并且不太好理解,更不太好应用到自己的项目中。...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • KVC\KVO-代理-通知-整理中

    KVC\KVO-代理-通知

  • Key-Value-Observing OC&Swift

    KVC 支持实例变量,KVO 只能手动支持手动设定实例变量的KVO实现监听。KVO通过set方法来通知。或者KVC...

  • KVO、KVC、通知

    一、KVC ====基本概念 它是一种可以直接通过字符串类型的属性名(key)来访问某个类属性的机制。而不是通过调...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • 数据存储

    1.1.3.使用通知传值 1.2.Segue使用 2. KVC&&KVO2.1.什么是KVC KVC - Key ...

  • KVC、KVO

    KVC、KVO探识(一)KVO和KVO的详细使用 KVC、KVO探识(二)KVC你不知道的东西 KVC、KVO探识...

  • GNUstep KVC/KVO探索(二):KVO的内部实现

    GNUstep KVC/KVO探索(一):KVC的内部实现GNUstep KVC/KVO探索(二):KVO的内部实...

网友评论

    本文标题:Swift3.0 KVO/KVC/通知的应用

    本文链接:https://www.haomeiwen.com/subject/anglqxtx.html