基于视图的NSTableView通过绑定和委托产生奇怪的结果

时间:2012-02-25 17:21:05

标签: objective-c macos osx-lion

我有一个NSTableView,其内容使用filterPredicate绑定到arrayController。 tableView是基于视图的,因此其委托设置为具有

的对象
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

方法。我得到奇怪的行为,这可能与我的观察有关,即使控制器的arrangeObjects数为0,也会调用此方法。此外,每次调用该方法时,它要求的行数是总数数组控制器内容中的对象(与arrangeObjects相对)。它认为可能是因为我设置了使用

请求的cellView的objectValue
cellView.objectValue = [arrayController arrangedObjects] objectAtIndex:row];

通常是错误的。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

对于绑定的情况,

objectValueForTableColumn不是必需的。刚刚把头撞到了墙上几分钟,然后带着这条阻力最小的道路回来了:

1)将您的NSOutlineView内容绑定到NSTreeController(arrangeObjects控制器键)

2)将每个NSTableCellView的子视图绑定到封闭的NSTableCellView(objectValue.foo,其中foo是目标字段的关键路径)

3)为大纲视图中的每一列设置标识符(我这样做是为了跟踪启动之间对表列的重新排序)

4)确保每个NSTableCellView的标识符都设置为Automatic(或者与表列相同)**这很重要并且与我混淆**

5)当你调用makeViewWithIdentifier时:确保你传递tableColumn.identifier

这假设每个表列只有一个单元格视图类型。否则,您需要在makeViewWithIdentifier中传递所需单元格视图的正确标识符:。

答案 1 :(得分:0)

好吧,我仍然无法解释为什么视图的行为与原来一样,但我确实设法让事情正确行事,执行以下操作:

  • 将tableView内容绑定到arrayController的arrangeObjects
  • 将tableView中使用的tableCellview的各种元素绑定到tableCellView的objectValue的相应keyPath
  • 按如下方式提供每个tableCellView(其中BILSelectableRoundedTableCellView恰好是NSTableCellView的子类):

    (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    
    NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];
    
    if (numberOfObjects == 0)
        return nil;
    
    if (row >= numberOfObjects)
        return nil;
    
    BILSelectableRoundedTableCellView *viewForTableColumnRow = [self.myTableView makeViewWithIdentifier:@"DataCell" owner:self];
    
    return viewForTableColumnRow; }
    

最后,使用实现以下内容的数据源:

(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];

if (numberOfObjects == 0)
    return nil;

if (row >= numberOfObjects)
    return nil;

return [self.arrayController.arrangedObjects objectAtIndex:row]; }

使用后者似乎与文档相反,但是必须使事情正常工作。有趣的是,使用绑定时不会调用其他数据源方法(numberOfRowsInTableView),尽管在我不使用绑定时会调用它。