问候,
我有一个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进行所有这些(如果我这样做的话可以正常工作),但不管出于什么原因,我选择不这样做。
答案 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];
}
}