2010-02-22 5 views
2

코코아를 배우고 있는데 문제가 있습니다. NSMutableArray의 내용을 NSTableView에 바인딩으로 바인딩하고 싶습니다. 나는 그들에 관한 많은 문서를 읽었지 만 나는 그것들을 작동하게 만들 수 없다. (내 테이블에는 아무것도 표시되지 않는다.) MTMTask.mNSTableView를 NSMutableArray에 바인딩하기

MTMTask.h

@interface MTMTask : NSObject { 
NSString *priority; 
NSString *text; 
} 

@property(copy) NSString* priority; 
@property(copy) NSString* text; 

- (id) initWithPriority :(NSString*)newPriority andText:(NSString*)newText; 

@end 

:

내가 2 곳, prioritytext을 포함 MTMTask라는 간단한 모델을 만들어 : 여기

는 사실이다
#import "MTMTask.h" 

@implementation MTMTask 

@synthesize text, priority; 

- (id) initWithPriority:(NSString *)newPriority andText:(NSString *)newText { 
if (self = [super init]) { 
    priority = newPriority; 
    text = newText; 
    return self; 
} 
return nil; 
} 

@end 

그런 다음 저는 cre

#import "MTMTaskController.h" 

@implementation MTMTaskController 

- (void) awakeFromNib 
{ 
MTMTask *task1 = [[MTMTask alloc] initWithPriority:@"high" andText:@"Feed the hungry cat"]; 
MTMTask *task2 = [[MTMTask alloc] initWithPriority:@"low" andText:@"Visit my family"]; 

_tasksList = [[NSMutableArray alloc] initWithObjects:task1, task2, nil]; 
} 

- (NSMutableArray*) tasksList 
{ 
return _tasksList; 
} 

@end 

MTMTaskController.m

MTMTaskController.h

#import <Cocoa/Cocoa.h> 
#import "MTMTask.h" 

@interface MTMTaskController : NSObject { 
NSMutableArray *_tasksList; 
} 

- (NSMutableArray *) tasksList; 

@end 

그리고 마지막으로 나는 MainMenu.xib 편집 : 다음 MTMTaskController를 ated에 나는 NSObject을 추가 MTMTaskController에 해당 클래스를 설정합니다. 그런 다음 TasksListController이라는 NSArrayController를 추가하고 내용 콘센트를 MTMTaskController.tasksList에 바인딩했습니다. 또한 모드를 Class으로 설정하고 클래스 이름을 MTMTask으로 설정했습니다. 나는 valueNSTableView 두 열의 콘센트를 TasksListController 텍스트와 우선 순위로 묶었습니다.

그러나 프로그램을 실행할 때 실제로 성공하지는 않습니다. 테이블에 아무것도 표시되지 않습니다.

내 문제에 대한 아이디어가 있으십니까? 나는 뭔가를 놓치고 있다고 생각하지만 나는 무엇을 알 수 없다.

미리 감사드립니다.

+0

컨트롤러와 개체가 실제로 만들어지고 있는지 확인하기 위해 중단 점을 설정 했습니까?컨트롤러를 xib 파일에 객체로 추가하는 것을 잊었을 수도 있습니다.이 경우'awakeFromNib'는 호출되지 않습니다. – Abizern

+0

방금 ​​시도 : 나는'awakeFromNib'에 NSLog() 호출을 넣었고 콘솔에 표시됩니다. 문제가없는 것처럼 보입니다. – Thomas

답변

2

깨어있는 컨트롤러의 개체를 nib에서 할당 할 때 개체를 만들고 배열에 추가 한 다음 해당 배열을 작업 목록으로 설정합니다.

바인딩에 관한 사항은 바인딩 된 객체가 바운드 한 내용이 변경되었음을 알리는 메커니즘 인 KVO (Key value observing)를 인식해야한다는 것입니다.

awake from nib 방법에서는 KVO를 호출하지 않는 배열을 직접 설정했습니다.

download from here 수있는 예제 Xcode 프로젝트 (Xcode 3.1) 만들었습니다. 당신이 과제의를 끼워 수

또는

- (void)awakeFromNib { 
    Task *task1 = [[Task alloc] initWithPriority:@"high" andText:@"Feed the cat"]; 
    Task *task2 = [[Task alloc] initWithPriority:@"low" andText:@"Visit my familiy"]; 

    self.taskArray = [[NSMutableArray alloc] initWithObjects:task1, task2, nil]; 

} :이 작업 목록과 당신을 위해 KVO을 담당 내가 속성 구문을 사용하여 배열을 할당하고있는 awakeFromNib 메소드 내에서 속성을 생성 willChangeValueForKey:didChangeValueForKey: 메시지가 있지만 운동 기록으로 남겨 두겠습니다.

+0

아주 잘 작동합니다! 고마워요! 네 설명을 이해했다고 생각해. 자주 @property를 사용해야합니다. – Thomas

+0

설명 주셔서 감사합니다! 나는 오늘 똑같은 문제를 보았다. – nonamelive

+0

당신의 설명도 나를 도왔습니다. 거센 두통을 저에게 보내 주셔서 감사합니다! – Dev

관련 문제