Делегат NSTableView не работает / не заполняет ячейки
В моем приложении есть 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 не работает вообще.
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;
}