我如何使用setValue:forKeyPath和valueForKeyPath

时间:2012-04-03 05:38:33

标签: cocoa

我是另一位初学者,试图了解可可及其复杂性。我正在阅读DeVoe的“Objective-C”。在关键值编码一节中,有一些setValue:forKeyPath:的例子。不知怎的,试试我可能无法让它发挥作用。

以下是代码:

// Bar.h
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Bar : NSObject
{
    NSArray *array;
    NSString *stringOnBar;
}
@property (retain,nonatomic) NSArray *array;
@property (retain,nonatomic) NSString *stringOnBar;
@end


@interface Foo : NSObject 
{
    Bar *bar;
    NSString *stringOnFoo;
}
@property (retain,nonatomic) Bar *bar;
@property (retain,nonatomic) NSString *stringOnFoo;
@end

//
// Bar.m
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//

#import "Bar.h"

@implementation Bar
@synthesize array;
@synthesize stringOnBar;

@end

@implementation Foo

@synthesize bar;
@synthesize stringOnFoo;

@end

//
// main.m
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//

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

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

    @autoreleasepool {

    Foo *foo = [[Foo alloc] init];
    [foo setValue:@"blah blah" forKey:@"stringOnFoo"];
    NSString *string = [foo valueForKey:@"stringOnFoo"];
    NSLog(@"string: %@", string);

    [foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"]; 
    NSString *string2 = [foo valueForKeyPath:@"bar.stringOnBar"]; 
    NSLog(@"string2: %@",string2);

    }
    return 0;
}

string2为NULL!

我不明白这一点。据我所知,使用@property时,所有代码都符合KVC标准。但似乎关键路径不起作用。

1 个答案:

答案 0 :(得分:3)

foo.bar为nil(您没有为bar设置值)因此您的KVC访问器将无提示失败或返回nil - 密钥路径消息的值基本上被分解为单独的访问器,并且如果路径上的任何内容不存在,则路径无法完成。

创建一个新的Bar对象并将其分配给foo.bar,然后您的密钥路径代码将起作用。