gpt4 book ai didi

objective-c - 当值改变时 KVO 不触发

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:29 26 4
gpt4 key购买 nike

我正在尝试使用 Apple 的 KVC 进行一些测试,但由于某些原因,当我通过 KVC 更改值时无法触发 KVO。

我有以下代码:

#import <Foundation/Foundation.h>

@interface Character : NSObject
{
NSString *characterName;
NSInteger ownedClowCards;
}
@property (nonatomic, retain) NSString *characterName;
@property (nonatomic, assign) NSInteger ownedClowCards;
-(void)hasLostClowCard;
-(void)hasGainedClowCard;
@end

@implementation Character
@synthesize characterName;
@synthesize ownedClowCards;

-(void)hasLostClowCard
{

}

-(void)hasGainedClowCard
{

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"Change");
}

@end

int main()
{
Character *sakura;
Character *shaoran;

//---------------------------------------------------------------------
// Here begins the KVO section.

[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

//Create and give the properties some values with KVC...

sakura = [[Character alloc] init];
[sakura setValue:@"Sakura Kinomoto" forKey:@"characterName"];
[sakura setValue:[NSNumber numberWithInt:20] forKey:@"ownedClowCards"];

shaoran = [[Character alloc] init];
[shaoran setValue:@"Li Shaoran" forKey:@"characterName"];
[shaoran setValue:[NSNumber numberWithInt:21] forKey:@"ownedClowCards"];

//Done! Now we are going to fetch the values using KVC.

NSString *mainCharacter = [sakura valueForKey:@"characterName"];
NSNumber *mainCharCards = [sakura valueForKey:@"ownedClowCards"];

NSString *rival = [shaoran valueForKey:@"characterName"];
NSNumber *rivalCards = [shaoran valueForKey:@"ownedClowCards"];

NSLog(@"%@ has %d Clow Cards", mainCharacter, [mainCharCards intValue]);
NSLog(@"%@ has %d Clow Cards", rival, [rivalCards intValue]);

[sakura setValue:[NSNumber numberWithInt:22] forKey:@"ownedClowCards"];
}

就像您看到的那样,它是非常非常基本的代码,所以我很惭愧,无论出于何种原因我都无法让它发挥作用。我要做的就是在 ownedClowCards 更改时收到通知。我正在注册观察员。当我运行我的程序时,我希望在程序运行完成后看到一次消息“已更改”。但它从来没有。 Changed 永远不会打印到我的程序中,所以我假设 observeValueForKeyPath:ofObject:change:context: 没有被调用。

有什么帮助吗?

最佳答案

[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

您在初始化 sakura 之前执行上述操作。当然,设置 nil 以观察对 nil 的更改不会执行任何操作。

关于objective-c - 当值改变时 KVO 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12408923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com