Делегат 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;
}
Другие вопросы по тегам