我通过“适用于Mac OS X编程”中的“关键值编码”一章的工作。我已经建立了一个滑块和标签,都绑定到菲,一个int的接口。如果我设置该属性向菲只读,移动滑块还是引起标签来改变它的值。我原以为我会得到某种错误的这一点。如果该属性是只读的,怎么就滑块仍然可以写入财产?我认为,这将有没有制定者创建的,KVC是行不通的。感谢。

下面是我正在使用的代码:

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject
{
    int fido;
}

@property (readonly, assign) int fido;

@end

#import "AppController.h"

@implementation AppController

@synthesize fido;

- (id)init
{
    [super init];
    [self setValue:[NSNumber numberWithInt:5] forKey:@"fido"];
    NSNumber *n = [self valueForKey:@"fido"];
    NSLog(@"fido = %@", n);
    return self;
}
@end

替代文字http://idisk.me.com/nevan/Public /Pictures/Skitch/Window-20091001-174352.png

有帮助吗?

解决方案

AppController.h:

@interface AppController : NSObject
{
        int fido;
}

@property (readonly, assign) int fido;
@end

导入 “AppController.h”

@implementation AppController
@synthesize fido;
...
@end

此时,你已宣布AppController的具有-fido方法和已合成的方法。没有-setFido:方法。那么,为什么下面的“工作”?

- (id)init
{
        if (self=[super init]) {
            [self setValue:[NSNumber numberWithInt:5] forKey:@"fido"];
            NSNumber *n = [self valueForKey:@"fido"];
            NSLog(@"fido = %@", n);
        }
        return self;
}

(顺便说一句:我你的固定-init实现正确图案)

这工作,因为KVC遵循的启发式的设置或获取价值。调用-setValue:forKey:首先查找-setFoo:。如果没有找到,它然后查找实例变量foo和直接设置它。

请注意,如果你改变实例变量fido_fido,该集将工作,但valueForKey将返回0,因为它调用合成方法(因为我在64位,在@synthesize合成一个fido实例变量。混乱,我知道)。

如果你要改变你的伊娃以bar然后用@synthesize foo=bar;的名称,代码会在运行时失败。

您将看到:

2009-10-01 08:59:58.081 dfkjdfkjfjkfd[24099:903] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppController 0x20000e700> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fido.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00007fff85b055a4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x00007fff85c5a0f3 objc_exception_throw + 45
    2   CoreFoundation                      0x00007fff85b5caf9 -[NSException raise] + 9
    3   Foundation                          0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
(
    0   CoreFoundation                      0x00007fff85b055a4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x00007fff85c5a0f3 objc_exception_throw + 45
    2   CoreFoundation                      0x00007fff85b5caf9 -[NSException raise] + 9
    3   Foundation                          0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
    4   dfkjdfkjfjkfd                       0x0000000100000d96 -[AppController init] + 130

其他提示

具有只读属性意味着编译器不会产生你制定者该属性。它仍然是法律通过KVO / KVC写信给它。

在编译器指令@property@synthesize只是速记的方法来创建方法来获取和设置变量的问题。

创建的设置方法被命名为setFido:,和吸气剂的方法是刚刚命名fido

在只读指定,我相信,只是告诉编译器不创建setter方法,但只有吸气。它不把任何种类的屏障中设置通过其他方式可变的方式。

(希望我已经获得了所有正确的。祝你好运!)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top