【问题标题】:NSTableView delegate not working/not filling cellsNSTableView 委托不工作/不填充单元格
【发布时间】:2014-10-04 17:11:56
【问题描述】:

我的应用程序中有一个 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 根本不起作用。

【问题讨论】:

    标签: objective-c macos delegates nstableview 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;
    }
    

    【讨论】:

    • 非常感谢,这解决了1/2的问题!现在单元格完全是空白的。它加载正确数量的单元格,您可以滚动浏览它们。但它们完全是白色的。单元格中的文本颜色是黑色而不是白色,我什至在 viewForTableColumn 中将它们硬编码为黑色。
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2022-07-05
    • 2014-04-25
    相关资源
    最近更新 更多