iphone – 键值观察中上下文参数的重要性

iphone – 键值观察中上下文参数的重要性,第1张

概述在以下方法中使用context参数是用来注册键值通知的。文档仅将其表示为任意数据集。 addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew context:nil 有人可以说明一下吗? 谢谢 我希望这个解释不是太抽象,无法理解。 假设你创建一个MyViewController类,它是UIV 在以下方法中使用context参数是用来注册键值通知的。文档仅将其表示为任意数据集。

addobserver:self forKeyPath:@"selectedindex" options:NSkeyvalueObservingOptionNew context:nil

有人可以说明一下吗?

谢谢

解决方法 我希望这个解释不是太抽象,无法理解。

假设你创建一个MyVIEwController类,它是UIVIEwController的一个子类。你没有UIVIEwController的源代码。

现在,您决定让MyVIEwController使用KVO观察self.vIEw中心属性的更改。所以你把自己加入观察者:

- (voID)vIEwWillAppear:(BOol)animated {    [super vIEwWillAppear:animated];    [self.vIEw addobserver:self forKeyPath:@"center" options:0 context:NulL];}- (voID)vIEwDIDdisappear:(BOol)animated {    [self.vIEw removeObserver:self forKeyPath:@"center"];    [super vIEwDIDdisappear:animated];}

这里的问题是你不知道UIVIEwController是否也注册为self.vIEw的中心的观察者。如果是这样,那么你可能会遇到两个问题:

>当视图的中心改变时,您可能会被调用两次。
>当您以观察者身份移除自己时,还可以删除UIVIEwController的KVO注册。

您需要一种注册自己作为与UIVIEwController的KVO注册区别的观察者的方法。这是上下文参数的来源。你需要传递一个上下文的值,你绝对确定UIVIEwController不用作上下文参数。当您注销时,您再次使用相同的上下文,以便您只删除注册,而不是UIVIEwController的注册。在您的observeValueForKeyPath:ofObject:change:context:方法中,您需要检查上下文以查看该消息是否为您或您的超类。

确保您使用没有其他用途的上下文的一种方法是在MyVIEwController.m中创建一个静态变量。注册和注销时使用,如下所示:

static int kCenterContext;- (voID)vIEwWillAppear:(BOol)animated {    [super vIEwWillAppear:animated];    [self.vIEw addobserver:self forKeyPath:@"center" options:0 context:&kCenterContext];}- (voID)vIEwDIDdisappear:(BOol)animated {    [self.vIEw removeObserver:self forKeyPath:@"center" context:&kCenterContext];    [super vIEwDIDdisappear:animated];}

然后在您的observeValueForKeyPath:…方法中,检查如下:

- (voID)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(ID)object    change:(NSDictionary *)change context:(voID *)context{    if (context == &kCenterContext) {        // This message is for me.  Handle it.        [self vIEwCenterDIDChange];        // Do not pass it on to super!    } else {        // This message is not for me; pass it on to super.        [super observeValueForKeyPath:keyPath ofObject:object            change:change context:context];    }}

现在你保证不要干扰你的超类的KVO,如果有的话。如果有人制作也使用KVO的MyVIEwController的子类,它不会干扰您的KVO。

还要注意,您可以为观察到的每个关键路径使用不同的上下文。然后,当系统通知您更改时,您可以检查上下文而不是检查密钥路径。测试指针相等性比检查字符串相等性要快一些。例:

- (voID)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(ID)object    change:(NSDictionary *)change context:(voID *)context{    if (context == &kCenterContext) {        [self vIEwCenterDIDChange];        // Do not pass it on to super!    } else if (context == &kBackgroundcolorContext) {        [self vIEwBackgroundDIDChange];        // Do not pass it on to super!    } else if (context == &kAlphaContext) {        [self vIEwAlphaDIDChange];        // Do not pass it on to super!    } else {        // This message is not for me; pass it on to super.        [super observeValueForKeyPath:keyPath ofObject:object            change:change context:context];    }}
总结

以上是内存溢出为你收集整理的iphone – 键值观察中上下文参数的重要性全部内容,希望文章能够帮你解决iphone – 键值观察中上下文参数的重要性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1041022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存