tableView sortDescriptorsDidChange:没有被调用

时间:2010-01-14 18:05:20

标签: objective-c cocoa sorting nstableview

问候,

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

[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]];
在我的代码中,

(其中“name”是最左列的标识符),sortDescriptorsDidChange永远不会被调用。当我读到(误读?)Apple的NSTableView文档时,我认为我应该这样做。我做错了什么?

P.S。我知道我也可以使用NSArrayController进行所有这些(如果我这样做的话可以正常工作),但不管出于什么原因,我选择不这样做。

1 个答案:

答案 0 :(得分: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];
    }
}