Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTableView委托不工作/未填充单元格_Objective C_Macos_Delegates_Nstableview_Reloaddata - Fatal编程技术网

Objective c NSTableView委托不工作/未填充单元格

Objective c NSTableView委托不工作/未填充单元格,objective-c,macos,delegates,nstableview,reloaddata,Objective C,Macos,Delegates,Nstableview,Reloaddata,我的应用程序中有一个NSTableView,在用户在NSTextField中键入一个字母后,我正在加载数据 以下是我的NSTableView委托方法 -(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { NSLog(@"%lu rows!", (unsigned long)contactsArr.count); return contactsArr.count; } -(NSInteger)numberOfC

我的应用程序中有一个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方法有时只运行。重新加载数据根本不起作用。

如果要将其反转,首先要做的是在填充之前检查
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中将它们硬编码为黑色。