首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AddObserver叉道::未响应

AddObserver叉道::未响应
EN

Stack Overflow用户
提问于 2015-04-11 02:04:17
回答 2查看 937关注 0票数 0

我有下面的代码,用于尝试观察一个变量,并在它发生变化时重新生成文本。但到目前为止什么也没有发生。

代码语言:javascript
复制
-(void)viewdidload{    
    float Index = 1;//declared in header locally
    [self addObserver:self forKeyPath:@"Index" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

    [self generateAdviceText];
 }   



-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"inside");
if([keyPath isEqualToString:@"Index"]){
    NSLog(@"INDEX CHANGED");
    [self generateAdviceText];
}
}

-(void)generateAdviceText{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *name = ((User *)appDelegate.users[self.currentUserIndex]).name;
NSString *clothWear = @"HAT";

NSMutableAttributedString *adviceString = [[NSMutableAttributedString alloc]initWithString:@"\"..."];
[adviceString appendAttributedString:[self boldString:name]];
[adviceString appendAttributedString:[self normalString:@", remember be extra aware of the cats today. The index is "]];
[adviceString appendAttributedString:[self boldString:[@(Index) stringValue]]];
[adviceString appendAttributedString:[self normalString:@", sth "]];
[adviceString appendAttributedString:[self boldString:clothWear]];
[adviceString appendAttributedString:[self normalString:@" sth "]];
[adviceString appendAttributedString:[self boldString:sth]];
[adviceString appendAttributedString:[self normalString:@"...\""]];

self.adviceLabel.attributedText = adviceString;

}

有人能发现我的错误吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-11 03:56:16

键值观察不会为实例变量(或任何其他类型的变量)的简单赋值生成更改通知。

在大多数情况下,您需要调用属性的setter来为该对象和该属性生成更改通知。

在较低的级别上,KVO只在调用来自-willChange...-didChange...非正式协议方法时才生成更改通知。这些方法是在具体情况下使用的:

  • 如果调用由键命名的属性的适当名称的setter或集合突变访问器(假设+automaticallyNotifiesObserversForKey:返回该键的true )。这是最好的办法。
  • 如果调用来自非正式协议的一个非正式协议方法(如-setValue:forKey: )(同样,假设+automaticallyNotifiesObserversForKey:返回该键的true )。
  • 如果由-mutable...ValueForKey:方法之一返回的集合代理被发送,则会发送突变方法(同样,取决于+automaticallyNotifiesObserversForKey:)。
  • 如果某些代码(通常在定义属性的类中)手动调用-willChange...-didChange...方法。

然而,正如乔·尚所指出的那样,物体观察自身是有问题的。如果一个对象想知道它的一个属性何时被更改,它应该将相关的代码放入其setter中。当然,它必须完全使用setter来修改其属性,而不是直接设置实例变量(就像KVO那样)。

不过,在您发布的代码中,您没有收到您期望的KVO更改通知,这一点也很好。您的代码将无限递归,直到它溢出堆栈时崩溃为止。您尝试这样做,以便更改索引调用-generateAdviceText,并使-generateAdviceText更改索引。

票数 2
EN

Stack Overflow用户

发布于 2015-04-11 02:55:20

Index类型是什么?静态变量还是属性?keyPath在addObserver:forKeyPath:options:contexts:中必须是某个对象的属性(KVC兼容),您可以读取[医] NSHipster'sobjc.io #7来获得更多信息。

另一方面,如果Index是属性,则这里不需要使用KVO。您可以重写Index的setter方法,并在Index更新时执行一些操作。

代码语言:javascript
复制
- (void)setIndex:(int)index
{
    _index = index;
    // add you generateAdviceText method here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29573223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档