나는 간단한 코코아 애플리케이션을 만들었습니다. MainMenu.xib에서 NSDatePicker와 NSTextField를 추가했습니다. 이 두 객체는 App Delegate의 속성에 대한 Value 바인딩을가집니다. 사용자가 NSDatePicker에서 날짜를 변경하면 NSTextField가 업데이트 될 것으로 예상됩니다. 이것은 일어나지 않습니다. 로그 여기종속 키는 어떻게 등록됩니까? (Key-Value Observing)
@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
됩니다 : dateFromPicker에 대한 관찰자 일부 NSLog 문에
// 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
업데이트 코드 : 내가 아는
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.
NSArrayController의 하위 클래스에 넣을 때까지 위의 코드가 제대로 작동한다는 것을 발견했습니다. 그것이 원래 프로젝트에서 있었던 부분이지만,이 문제를 해결하기위한 간단한 프로젝트를 만들었습니다. 그래서 KVO에 영향을 미치는 NSArrayController 클래스에 대한 무언가가 있어야합니다. –