Как се регистрират зависимите ключове? (Наблюдение на ключ-стойност)

Създадох просто приложение за какао. В MainMenu.xib добавих NSDatePicker и NSTextField. И двата обекта имат обвързване на стойност към свойствата на делегата на приложението. Очаквам, че когато потребителят промени датата в 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