Как регистрируются зависимые ключи? (Наблюдение за ключевыми значениями)

Я создал простое какао-приложение. В MainMenu.xib я добавил NSDatePicker и NSTextField. У обоих этих объектов есть привязки Value к свойствам App Delegate. Я ожидаю, что когда пользователь изменит дату в NSDatePicker, NSTextField будет обновлен. Этого не происходит. Вот делегат приложения:

//  AppDelegate.h
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (nonatomic, strong) NSDate *dateFromPicker;
@property (nonatomic, readonly) NSString *dateString;

@end


//  AppDelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

}

- (NSString *)dateString
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    return [formatter stringFromDate:self.dateFromPicker];
}

+ (NSSet *)keyPathsForValuesAffectingDateString
{
    return [NSSet setWithObject:@"dateFromPicker"];
}

@end

Обновленный код с наблюдателем для dateFromPicker и некоторыми операторами NSLog:

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self addObserver:self forKeyPath:@"dateFromPicker" options:0 context:NULL];
    self.dateFromPicker = [NSDate dateWithNaturalLanguageString:@"12/12/12"];
}

- (NSString *)dateString
{
    NSLog(@"dateString was called.");
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    return [formatter stringFromDate:self.dateFromPicker];
}

+ (NSSet *)keyPathsForValuesAffectingDateString
{
    NSLog(@"keyPathsForValuesAffectingDateString was called.");
    return [NSSet setWithObject:@"dateFromPicker"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:         (NSDictionary *)change context:(void *)context
{
    NSLog(@"dateFromPicker changed.");
}

@end

Вот журнал:

2012-08-10 15:37:15.086 ... keyPathsForValuesAffectingDateString was called.
2012-08-10 15:37:15.087 ... dateString was called.
2012-08-10 15:37:15.116 ... dateFromPicker changed.
2012-08-10 15:37:15.117 ... dateString was called.
2012-08-10 15:37:19.831 ... dateFromPicker changed.
2012-08-10 15:37:19.831 ... dateString was called.

person Gold Slash    schedule 10.08.2012    source источник
comment
Я обнаружил, что приведенный выше код работает нормально, пока не будет помещен в подкласс NSArrayController. Это то место, где это было изначально в моем проекте, но я создал простой проект для решения этой проблемы. Так что в классе NSArrayController должно быть что-то, что влияет на KVO.   -  person Gold Slash    schedule 11.08.2012


Ответы (1)


Я знаю, что это не совсем то, о чем вы спрашивали, но ...

Почему бы вам не привязать NSTextField к свойству NSDate и не добавить к нему средство форматирования в Interface Builder?

person Analog File    schedule 10.08.2012
comment
Это сработает, но я действительно пытаюсь лучше понять зависимые ключи. Я создал этот пример, чтобы задать вопрос и, надеюсь, получить объяснение, почему это не работает. - person Gold Slash; 11.08.2012
comment
Что ж, ничего подозрительного в коде не вижу. Попробуйте настроить наблюдателя и посмотрите, срабатывает ли он (если да, то это связано с привязками, а не с KVO). Также попробуйте изменить дату из кода вместо использования средства выбора и посмотрите, сработает ли он. И, возможно, добавьте несколько распечаток в журнал, чтобы вы могли отслеживать, что и когда происходит. - person Analog File; 11.08.2012