2014-10-04 7 views
1

사용자가 NSTextField에서 문자를 입력 한 후 데이터를로드하는 응용 프로그램에 NSTableView가 있습니다. 여기 NSTableView 대리자가 작동하지 않음/셀을 채우지 않음

내 NSTableView는 위임 방법이 있습니다 내 위임 및 데이터 소스가 모두이 클래스로 설정되어 있는지 제가 확인했다

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 
    NSLog(@"%lu rows!", (unsigned long)contactsArr.count); 
    return contactsArr.count; 
} 
-(NSInteger)numberOfColumns:(NSTableView *)tableView { 
    return 1; 
} 

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 

    NSLog(@"filling tableview yo"); 

    NSTableCellView *result = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 

    NSButton *nameField = [result viewWithTag:10]; 

    NSButton *numberField = [result viewWithTag:20]; 

    ABPerson *indexedPerson = contactsArr[row]; 

    [nameField setStringValue:[NSString stringWithFormat:@"%@ %@",[indexedPerson valueForKey:kABFirstNameProperty] 
           ,[indexedPerson valueForKey:kABLastNameProperty]]]; 

    [numberField setStringValue:[NSString stringWithFormat:@"%@",[indexedPerson valueForKey:kABPhoneProperty]]]; 


    if (result == nil) { 

     result = [[NSTableCellView alloc] initWithFrame:CGRectMake(0, 0, 267, 52)]; 

     result.identifier = @"cell"; 
    } 

    return result; 

} 

. 나는 또한 나의 콘센트가 설치되었는지 확인했다. 사용자가 키보드에서 무언가를 입력하면 NSMutableArray가 검색 결과로 재설정되고 사실 배열에 ABPerson 객체가 있다는 사실을 기록합니다. 문제는 화면에 셀이 나타나지 않는다는 것입니다. viewForTableColumn 메소드는 가끔씩 만 실행됩니다. reloadData가 전혀 작동하지 않습니다.

답변

1

당신은 일종의 역전이 있습니다. 가장 먼저 할 일은 채우기 전에 NSTableviewCell이 null인지 확인하는 것입니다.

그렇지 않으면 당신은 대리자 메서드의 끝에서 새로운 세포를 생성하고 빈에 반환됩니다

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    NSLog(@"filling tableview yo"); 
    NSTableCellView *result = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 

    if (result == nil) { 
     result = [[NSTableCellView alloc] initWithFrame:CGRectMake(0, 0, 267, 52)]; 
     result.identifier = @"cell"; 
    } 

    NSButton *nameField = [result viewWithTag:10]; 
    NSButton *numberField = [result viewWithTag:20]; 
    ABPerson *indexedPerson = contactsArr[row]; 

    [nameField setStringValue:[NSString stringWithFormat:@"%@ %@",[indexedPerson valueForKey:kABFirstNameProperty] 
           ,[indexedPerson valueForKey:kABLastNameProperty]]]; 

    [numberField setStringValue:[NSString stringWithFormat:@"%@",[indexedPerson valueForKey:kABPhoneProperty]]]; 

    return result; 
} 


편집 : 사용자 정의 셀과 버전을 추가

, I 더 깨끗한 다음보기 태그를 사용하여 기본 셀 너머의 셀을 사용자 정의해야 할 때마다 NSTableViewCell을 서브 라이 싱하는 것이 좋습니다. null을 확인하지 않아도 식별자를 할당해야합니다.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

    NSLog(@"filling tableview yo"); 
    PersonTableCellView *cellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 

    // Just in Case you got multiple columns 
    if([tableColumn.identifier isEqualToString:@"cell"]) 
    { 
     ABPerson *indexedPerson = contactsArr[row]; 
     NSString *nameInfo = [NSString stringWithFormat:@"%@ %@", 
           indexedPerson[kABFirstNameProperty], 
           indexedPerson[kABLastNameProperty]]; 
     NSString *numberInfo = indexedPerson[kABPhoneProperty]; 

     NSLog(@"nameInfo = %@, numberInfo = %@", nameInfo, numberInfo); 
     //set the strings 
     cellView.nameField.stringValue = indexedPerson 
     cellView.numberField.stringValue = bugDoc.data.title; 

     return cellView; 
    } 
    return cellView; 
} 
+0

대단히 고맙습니다. 문제의 1/2을 해결해 주셔서 감사합니다. 이제 셀은 완전히 비어 있습니다. 정확한 양의 셀을로드하고 스크롤 할 수 있습니다. 그러나 그것들은 완전히 하얗다. 셀의 텍스트 색은 흰색이 아닌 검은 색이며 viewForTableColumn에서 검정색으로 하드 코딩됩니다. –

관련 문제