Ios AddObserver forkeypath::未响应

Ios AddObserver forkeypath::未响应,ios,objective-c,Ios,Objective C,我有下面的代码,我正在使用它来尝试观察一个变量,并在它改变时重新生成文本。但到目前为止,一切都没有发生:/ -(void)viewdidload{ float Index = 1;//declared in header locally [self addObserver:self forKeyPath:@"Index" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:

我有下面的代码,我正在使用它来尝试观察一个变量,并在它改变时重新生成文本。但到目前为止,一切都没有发生:/

-(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;
}


有人能看出我的错误吗?谢谢

什么是
索引
类型?静态变量还是属性?
addObserver:forKeyPath:options:contexts:
中的键路径必须是某个对象的属性(与KVC兼容),您可以读取并获取更多

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

- (void)setIndex:(int)index
{
    _index = index;
    // add you generateAdviceText method here
}

什么是
索引
类型?静态变量还是属性?
addObserver:forKeyPath:options:contexts:
中的键路径必须是某个对象的属性(与KVC兼容),您可以读取并获取更多

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

- (void)setIndex:(int)index
{
    _index = index;
    // add you generateAdviceText method here
}

什么是
索引
类型?静态变量还是属性?
addObserver:forKeyPath:options:contexts:
中的键路径必须是某个对象的属性(与KVC兼容),您可以读取并获取更多

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

- (void)setIndex:(int)index
{
    _index = index;
    // add you generateAdviceText method here
}

什么是
索引
类型?静态变量还是属性?
addObserver:forKeyPath:options:contexts:
中的键路径必须是某个对象的属性(与KVC兼容),您可以读取并获取更多

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

- (void)setIndex:(int)index
{
    _index = index;
    // add you generateAdviceText method here
}

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

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

在较低级别,KVO仅在调用中的
-willChange…
-didChange…
方法时才会生成更改通知。这些方法在特定情况下调用:

  • 如果调用了由该键命名的属性的正确命名的setter或collection-mutation访问器(假设该键的
    +automaticallynotifyesobserversforkey:
    返回true)。这是最好的办法

  • 如果调用中的
    -set…
    方法之一,例如
    -setValue:forKey:
    (再次假设
    +automaticallyNotifiesObserversForKey:
    为该键返回true)

  • 如果由
    NSKeyValueCoding
    -mutable…ValueForKey:
    方法之一返回的集合代理被发送到mutation方法(同样取决于
    +automaticallyNotifiesObserversForKey:

  • 如果某些代码(通常在定义属性的类中)手动调用
    -willChange…
    -didChange…
    方法

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


不过,在您发布的代码中,您没有收到预期的KVO更改通知也很好。您的代码将无限递归,直到溢出堆栈时崩溃。您试图使更改索引调用
-generateAdviceText
,并且
-generateAdviceText
更改索引。

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

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

在较低级别,KVO仅在调用中的
-willChange…
-didChange…
方法时才会生成更改通知。这些方法在特定情况下调用:

  • 如果调用了由该键命名的属性的正确命名的setter或collection-mutation访问器(假设该键的
    +automaticallynotifyesobserversforkey:
    返回true)。这是最好的办法

  • 如果调用中的
    -set…
    方法之一,例如
    -setValue:forKey:
    (再次假设
    +automaticallyNotifiesObserversForKey:
    为该键返回true)

  • 如果由
    NSKeyValueCoding
    -mutable…ValueForKey:
    方法之一返回的集合代理被发送到mutation方法(同样取决于
    +automaticallyNotifiesObserversForKey:

  • 如果某些代码(通常在定义属性的类中)手动调用
    -willChange…
    -didChange…
    方法

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

不过,在您发布的代码中,您没有收到预期的KVO更改通知也很好。您的代码将无限递归,直到溢出堆栈时崩溃。您试图使更改索引调用
-generateAdviceText<