KVC奇怪的行为

时间:2013-03-27 10:56:05

标签: objective-c key-value-observing

为什么此代码可以正常工作:

NSArray* arr = @[[CALayer layer], [CALayer layer]];
NSString *sumKeyPath = @"@sum.bounds.size.width";
CGFloat totalSize = [[arr valueForKeyPath:sumKeyPath] floatValue];

但是这段代码给出了错误:

NSArray* arr = @[[UIImage imageNamed:@"img1"], [UIImage imageNamed:@"img2"]];
NSString *sumKeyPath = @"@sum.size.width";
CGFloat totalSize = [[arr valueForKeyPath:sumKeyPath] floatValue];

错误 [NSConcreteValue valueForUndefinedKey:]:此类与密钥宽度不符合密钥值。

NSArray* arr = @[[UIView new], [UIView new]];
NSString *sumKeyPath = @"@sum.bounds.size.width";
CGFloat totalSize = [[arr valueForKeyPath:sumKeyPath] floatValue];

给出相同的错误

2 个答案:

答案 0 :(得分:8)

CALayervalueForKeyPath:的特殊实现。例如,以下工作:

CALayer *layer = [CALayer layer];
id x0 = [layer valueForKeyPath:@"bounds"];
// --> NSValue object containing a NSRect
id y0 = [layer valueForKeyPath:@"bounds.size"];
// --> NSValue object containing a NSSize
id z0 = [layer valueForKeyPath:@"bounds.size.width"];
// --> NSNumber object containing a float

但以下不起作用:

CALayer *layer = [CALayer layer];
id x = [layer valueForKey:@"bounds"];
// --> NSValue object containing a NSRect
id y = [x valueForKey:@"size"];
// --> Exception: '[<NSConcreteValue 0x71189e0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key size.'

因此,通常,包含NSValueNSRect的{​​{1}}个对象不符合键值。它仅适用于NSSize,因为CALayer实现处理整个密钥路径,而不是评估第一个密钥并传递剩余的密钥路径。

valueForKeyPath:没有UIImage的特殊实现。因此

valueForKeyPath:

有效,但

UIImage *img1 = [UIImage imageNamed:@"img1"];
id x1 = [img1 valueForKey:@"size"];
// --> NSValue containing a NSSize

不起作用。

答案 1 :(得分:2)

我认为错误会告诉您究竟是什么问题! “这个类不是键值宽度的关键值编码。”