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 – 键值观察中上下文参数的重要性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)