2010-04-23 3 views
0

나는 "간단하다"할 일 목록 프로젝트를 만들고 있으며 도로에서 몇 번의 충돌을 겪고있다. 문제는 내 NSTableView가 NSMutableArray "myArray"에서 데이터를 표시하지 않고 그 이유를 알 수 없다는 것입니다. 누군가 내 실수를 지적 할 수 있습니까?NSTableView에서 내 데이터를 표시하지 않습니다. 왜 그런 일이 일어나는거야?

/* 
IBOutlet NSTextField *textField; 
IBOutlet NSTabView *tableView; 
IBOutlet NSButton *button; 
NSMutableArray *myArray; 
*/ 

#import "AppController.h" 


@implementation AppController 


-(IBAction)addNewItem:(id)sender 
{ 

    NSString *myString = [textField stringValue]; 

    NSLog(@"my stirng is %@",myString); 
    myArray = [[NSMutableArray alloc] initWithCapacity:100]; 
    [myArray addObject:myString]; 

} 

- (int)numberOfRowsInTableView:(NSTableView *)aTableView 
{ 
    return [myArray count]; 
} 
- (id)tableView:(NSTableView *)aTableView 
objectValueForTableColumn:(NSTableColumn *)aTableColumn 
      row:(int)rowIndex 
{ 

    return [myArray objectAtIndex:rowIndex]; 
} 

-(id)init 
{ 
    [super init]; 
    [tableView setDataSource:self]; 
    [tableView setDelegate:self]; 

    NSLog(@"init"); 
    return self; 
} 

@end 
+0

이있는 tableView과에 textField가 연결되어 있는지 확인 Younshould하고 numberOfRows 및 objectValueForTableColumn 방법이 호출되는 경우 디버그를 확인합니다. –

답변

4

문제는 -init 메서드에서 tableView 변수가 여전히 0입니다. nib 파일이로드되면, 먼저 nib에 선언 된 모든 객체를 생성하고 초기화 한 다음 nib 파일 사이에 연결 (아웃렛, 바인딩, 작업)을 설정합니다. 설정되는 다양한 동작, 출력 또는 바인딩에 의존하는 사용자의 초기화 코드는 -init 메서드가 아닌 -(void)awakeFromNib 메서드에 있어야합니다. Interface Builder에서 dataSource를 설정하고 테이블 뷰의 아웃렛을 위임 할 수 있습니다. 메인 펜촉 창의 tableView에서 AppController로 컨트롤을 드래그하고 각 콘센트를 차례대로 선택하면됩니다.

또한 기본 데이터를 변경할 때마다 [tableView reloadData]을 호출하여 tableView에 이러한 변경 사항이 반영되도록해야합니다. 당신의 경우, 당신은 당신의 -addNewItem : 메소드에서 그것을 호출 할 필요가 있습니다. 그래서, 당신의 코드는 다음과 같이 보일 것이다 :

@implementation AppController 
- (id)init 
{ 
    if (nil == (self = [super init])) return nil; 
    myArray = [[NSMutableArray alloc] init]; 
    return self; 
} 
- (void)dealloc 
{ 
    [myArray release]; 
    [super dealloc]; 
} 
- (void)awakeFromNib 
{ 
    // assuming you're not just setting up these outlets in IB 
    [tableView setDataSource:self]; 
    [tableView setDelegate:self]; 
} 
-(IBAction)addNewItem:(id)sender 
{ 
    [myArray addObject:[textField stringValue]]; 
    [tableView reloadData]; 
} 
// data source methods same as in your code 
@end 
+0

질문과 관련이 없지만 init 메소드가 잘못되었습니다. [super init]에서 반환 된 값을 self에 할당해야하며 myArray를 할당하기 전에 self가 0이 아닌지 테스트해야합니다. – JeremyP

+0

네 말이 맞아. 내 코딩 스타일이 좀 웃기고, 혼란스러워 할지도 모른다고 걱정했기 때문에 그대로 두었습니다. 나는 그것을 추가하기 위해 지금 편집 할 것이다. –

+0

모든 도움말보다 나는 reloadData 메소드에 대해서조차 몰랐다. 나는 내가 사용하고있는 수업에 대해 더 많이 읽을 필요가있다. – lampShade

관련 문제