Как использовать setValue: forKeyPath и valueForKeyPath - PullRequest
1 голос
/ 03 апреля 2012

Я еще один новичок, пытающийся разобраться в Какао и его тонкостях. Я читал "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 НЕДЕЙСТВИТЕЛЕН!

Я не понимаю этого. Я понимаю, что при использовании @property весь код становится KVC-совместимым. И все же кажется, что ключевой путь не работает.

1 Ответ

3 голосов
/ 03 апреля 2012

foo.bar - это ноль (вы не установили значение для bar), поэтому ваши средства доступа к KVC молча завершатся с ошибкой или вернут ноль - значение для сообщения о пути к ключу по существу разбито на отдельные средства доступа и, если что-то напуть не существует, путь не завершен.

Создайте новый объект Bar и присвойте ему foo.bar, тогда ваш код пути ключа будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...