2

我有 3 个表格视图(10.7.2,Xcode 4.2)的窗口。它们都是在 IB 中创建的,并且 NSButtonCells 与插座相连。

我创建了控制器类,并用一些示例数据填充了所有三个视图:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
    return 10;
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn    *)aTableColumn row:(NSInteger)rowIndex {

NSButtonCell *buttonCell;

if(aTableView == dimensionTable) {    
    [dimensionButtonCell setTitle:@"Dimension"];
    buttonCell = dimensionButtonCell;
}
else if(aTableView == shopTable) {
    [shopButtonCell setTitle:@"Shop"];
    buttonCell = shopButtonCell;
}
else if(aTableView == countryTable) {
    [countryButtonCell setTitle:@"Country"];
    buttonCell = countryButtonCell;
}


return buttonCell;

}

我有两个问题:

  1. 我无法通过 GUI 更改复选框状态。不过,我可以以编程方式更改它。当您按住鼠标按钮时,它会闪烁一点,但不允许更改...

  2. 我试图像视图一样填充数据,而不是单元格的出口。它没有用。单元格视图中的 NSButtonCell cels 是否与基于视图的表视图或基于“普通”cel 的表视图有所不同?

4

1 回答 1

4

经过长时间的努力,我设法找到了问题的解决方案。问题的一部分是数据模型方面的简单错误,但这并不重要,更困难的是使用 NSTableView 委托和数据源来完成。

主要有 3 个困难阻碍了对这个问题的良好理解和管理:

  • - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex苹果的文档对表格视图的数据源- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row及其委托的差异和典型用法缺乏任何合理的解释。虽然看起来您可能需要后一种方法,因为 NSButtonCells 是自定义 NSCells 事实证明这不是必需的,但我还是把它留在了最后。

  • NSTableView 方法中的内部转换

  • 网络上几乎任何地方都没有记录问题

以下是您应该执行的步骤:

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {

    buttonCell = [aTableColumn dataCell];

    NSString *columnKey = [aTableColumn identifier];

    return buttonCell;

}

您可以看到无论您是否使用它都必须实现此方法。

- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    buttonCell = [tableColumn dataCell];

    NSString *columnKey = [tableColumn identifier];

    if(tableView == dimensionTable) {    

//        returnObject = @"Dimension";
        //        [dimensionButtonCell setTitle:@"Dimension"];
        //        buttonCell = dimensionButtonCell;
    }

    else if(tableView == shopTable) {

        [buttonCell setState:[[mySelectedShops objectAtIndex:row] integerValue]];
        [buttonCell setTitle:[myShops objectAtIndex:row]];

    }

    else if(tableView == countryTable) {

        [buttonCell setState:[[mySelectedCountries objectAtIndex:row] integerValue]];
        [buttonCell setTitle:[myCountries objectAtIndex:row]];

    }

    return buttonCell;

}

你可以看到我使用了第二种方法,但是objectValueForTableColumn可以单独使用。您还可以看到,我有 NSMutableArray mySelectedShops 和 mySelectedCountries 来为表格视图中的每一行保存 NSI​​nteger(1 或 0)包裹在 NSNumber 中。

如果设置 NSCell 的 state 或 integerValue 没有区别。两者都将选中和取消选中 NSButtonCell 值为 1 或 0 的 NSInteger 类型。

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {

    NSString *columnKey = [aTableColumn identifier];

    if(aTableView == dimensionTable) {    
//        [dimensionButtonCell setTitle:@"Dimension"];
//        buttonCell = dimensionButtonCell;
    }
    else if(aTableView == shopTable) {

        [mySelectedShops replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];

    }
    else if(aTableView == countryTable) {

        [mySelectedCountries replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];

    }

}

虽然我将 NSInteger 值传递给 NSCell 对象,但这里的 anObject 是 __NSCFBoolean 类型,这意味着某些事情无法按预期工作。为了能够将对象值替换为数组,我将其转换为 NSCell 只是为了获取 integerValues。它实际上也可以在没有演员表的情况下工作,所以这对我来说是另一个谜,但我更喜欢这种方式。

很明显,Apple 正在转向 UITableView 等基于视图的单元格。不过,我希望这会对某人有所帮助。

于 2011-11-15T10:29:20.467 回答