我的应用程序中有一个NSTableView,我在用户在NSTextField中输入一个字母后加载数据。
以下是我的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根本不起作用。
答案 0 :(得分: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;
}