0

问候,

我有一个 NSTableView 有两列可以正常工作...除了:如果我在 Interface Builder 中为表设置排序描述符,事情会按预期工作,并且 sortDescriptorsDidChange 会按预期调用。但是,如果我没有在 Interface Builder 中设置排序描述符,而是使用它:

[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]];

(其中“名称”是最左侧列的标识符)在我的代码中, sortDescriptorsDidChange 永远不会被调用。当我阅读(误读?)Apple 的 NSTableView 文档时,我认为我正在做的事情应该有效。我究竟做错了什么?

PS 我知道我也可以使用 NSArrayController 来完成所有这些工作(如果我这样做的话效果很好),但无论出于何种原因,我都选择不这样做。

4

1 回答 1

0

没有这个它应该可以工作,但是您是否尝试过自己发送 KVO 通知?

[tableView willChangeValueForKey:@"sortDescriptors"];
[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]];
[tableView didChangeValueForKey:@"sortDescriptors"]; 

如果您不想在 IB 中添加描述符,您可以执行以下操作

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)theColumn row:(NSInteger)rowIndex {
    //if we have no sort descriptor for this column create one based on it's identifier (instead of setting it for each in IB,saves time and prevents errors)
    NSSortDescriptor *desc = [theColumn sortDescriptorPrototype];
    if ([desc key] == nil) {
        NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:[theColumn identifier] ascending:YES];  
        [theColumn setSortDescriptorPrototype:sorter];
        [sorter release];
    }
}
于 2011-05-09T22:26:00.547 回答