2

このコードが正常に機能する理由:

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];

同じエラーを出す

4

2 に答える 2

8

CALayerの特別な実装がありvalueForKeyPath:ます。たとえば、次のように機能します。

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.'

したがって、一般的に、またはをNSValue含むオブジェクトはキー値に準拠していません。これは、実装が最初のキーを評価して残りのキーパスを渡すのではなく、キーパス全体を処理するためにのみ機能します。NSRectNSSizeCALayervalueForKeyPath:

UIImageの特別な実装はありませんvalueForKeyPath:。したがって

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

動作しますが

UIImage *img1 = [UIImage imageNamed:@"img1"];
id x1 = [img1 valueForKeyPath:@"size.width"];

動作しません。

于 2013-03-27T11:41:00.243 に答える
2

エラーはその問題が何であるかを正確に示していると思います!「このクラスは、キー幅のキー値コーディングに準拠していません。」

于 2013-03-27T11:06:06.237 に答える