2014-10-04 64 views
1

我在我的应用程序中有一个NSTableView,我在用户在NSTextField中键入字母后加载数据。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是否为空。

否则,你将在委托方法结束时创建一个新的细胞,并返回他们的空白

-(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; 
} 


编辑:

我加了一个版本的自定义单元格,我发现它更干净,然后使用视图标签,每次你需要定制超出基本的单元格时,你会更好地分类NSTableViewCell。并且不需要检查是否有空值,请确保分配标识符

- (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

非常感谢您解决了一半的问题!现在这些单元格完全是空白的。它加载正确数量的单元格,并且可以滚动浏览它们。但他们是完全白色的。单元格中的文本颜色是黑色的,而不是白色,我甚至在viewForTableColumn中将它们编码为黑色。 – 2014-10-04 17:33:27