2012-08-10 2 views
1

나는 간단한 코코아 애플리케이션을 만들었습니다. 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. 
+0

NSArrayController의 하위 클래스에 넣을 때까지 위의 코드가 제대로 작동한다는 것을 발견했습니다. 그것이 원래 프로젝트에서 있었던 부분이지만,이 문제를 해결하기위한 간단한 프로젝트를 만들었습니다. 그래서 KVO에 영향을 미치는 NSArrayController 클래스에 대한 무언가가 있어야합니다. –

답변

0

이 정확히되지 여기에 앱 위임입니다 당신이 묻고있는 것이지만 ...

왜 NSTextField를 NSDate 속성에 바인딩하지 않습니까? 인터페이스 빌더에서 포맷터를 추가합니까?

+0

그게 효과가 있지만, 나는 더 의존적 인 키를 더 잘 이해하려고 노력하고 있습니다. 이 예제를 작성하여 질문을하고 이것이 효과가없는 이유에 대한 설명을 얻을 수 있습니다. –

+0

글쎄, 나는 코드에서 용의자가 아무것도 참조하십시오. 옵저버를 설치하고 화재가 있는지 확인하십시오 (그렇다면 KVO가 아닌 바인딩과 관련된 것입니다). 또한 피커를 사용하는 대신 코드에서 날짜를 변경하고 화재가 발생하는지 확인하십시오. 그리고 로그에 몇 개의 출력물을 추가하여 언제 어떻게되는지 추적 할 수 있습니다. –

관련 문제