0

如何从我的 NSTableView 中手动删除 NSTableCellView(或其子类)?

当我清空包含信息的数组时,将 DB 排队以获取新信息,然后重新加载表数据,它只会使用与新数组列表中的索引值相似的索引值更新单元格。

前任。

我的数组中首先有 8 个对象,它们显示得很好。当我更新我的数组并且现在只有 3 个时,表中的前三个单元格被更新,而最后 5 个仍然是旧的。旧的不可选择,但仅可见。而且我怀疑我错过了一些重绘/dealloc ..

我在 TableView 上尝试了 setNeedsDisplay,但还没有运气。

我正在使用 ARC、Xcode 4.6.1 和 OS X 10.8.3

示例代码

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {

     return [_array count];
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

     [_tableView setNeedsDisplay];

     NSDictionary *d = [_array objectAtIndex:row];
     NSString *identifier = [tableColumn identifier];

     if ([identifier isEqualToString:@"MainCell"]) {

         CustomCellView *cellView = [tableView makeViewWithIdentifier:@"MainCell" owner:self];
         [cellView.textField setStringValue:d[@"from"]];
         [cellView.subject setStringValue:d[@"subject"]];
         [cellView.text setStringValue:d[@"text"]];
         [cellView.date setStringValue:d[@"date"]];

         return cellView;
     }

     return nil;
}
4

3 回答 3

1

你必须告诉 NSTableView reloadData(听起来你正在这样做)。当你这样做时,数据源的工作就是知道现在只有 3 行并给出答案numberOfRowsInTableView:(听起来你没有这样做)。您没有显示任何代码(为什么不显示?)所以当然所有这些都是猜测。

于 2013-03-25T22:36:12.073 回答
0

利用

[tableView removeRowsAtIndexSet:indexSet withAnimation:YES];
于 2013-03-26T12:52:01.290 回答
0

您可以使用此示例(清除/刷新/重绘)您的 cellView:

  1. 创建与原始框架相同的新单元格。
  2. 用与原始相同的框架重绘它。
  3. 将原始对象放入其中。

在这个例子中,“mainTable”是你表的 NSTableView*。

- (NSView *)tableView:(NSTableView *)aTableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    NSString* identifier = [tableColumn identifier];
    NSTableCellView* cellView = [[NSTableCellView new] initWithFrame:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]];

    [cellView drawRect:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]];
    cellView = [mainTable makeViewWithIdentifier:identifier owner:self];

    // do something with your cellView here ...

    return cellView;
}
于 2014-04-26T12:04:06.693 回答