gpt4 book ai didi

cocoa - 使用 KVO 触发属性更新

转载 作者:行者123 更新时间:2023-12-03 16:50:51 25 4
gpt4 key购买 nike

我很难通过键值观察手动触发属性更新。这是一个人为的示例来说明我的问题:

Bar.h

#import <Foundation/Foundation.h>

@interface Bar : NSObject
{
NSString *test;
}

@property (nonatomic, retain) NSString *test;

-(void) updateTest1;
-(void) updateTest2;

@end

酒吧.m

#import "Bar.h"

@implementation Bar

@synthesize test;

-(id) init
{
if (self = [super init])
{
self.test = @"initial";
}
return self;
}

-(void) updateTest1
{
self.test = @"updating 1";
}

-(void) updateTest2
{
NSString *updateString = @"updating 2";
[updateString retain];
test = updateString;
[self didChangeValueForKey:@"test"];
}

@end

Foo.h

#import <Foundation/Foundation.h>

@interface Foo : NSObject

@end

Foo.m

#import "Foo.h"

@implementation Foo

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

@end

main.m

#import <Foundation/Foundation.h>
#import "Foo.h"
#import "Bar.h"

int main (int argc, const char * argv[])
{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

Bar *bar = [Bar new];
Foo *foo = [Foo new];

[bar addObserver:foo forKeyPath:@"test" options:0 context:nil];

[bar updateTest1];
[bar updateTest2];

[pool drain];
return 0;
}

程序返回:

2011-08-09 03:57:52.630 Temp[5159:707] something changed!
Program ended with exit code: 0

为什么 didChangeValueForKey: 没有触发观察者的 observeValueForKeyPath:ofObject:change:context: 事件?这个方法是不是像我想象的那样有效?

最佳答案

它没有触发通知,因为您忘记了相应的

[self willChangeValueForKey:@"test"];

必须始终与 didChangeValueForKey:

配对

关于cocoa - 使用 KVO 触发属性更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6993727/

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