【问题标题】:tableView sortDescriptorsDidChange: not getting calledtableView sortDescriptorsDidChange:没有被调用
【发布时间】:2010-01-14 18:05:20
【问题描述】:

您好,

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

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

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

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

【问题讨论】:

  • 你什么时候打电话给setSortDescriptors?根据我的经验,当对象(在您的情况下为 tableView)尚未实例化时,我已经过早地调用它(例如从 nib 醒来)
  • 大概就是这样。我在 windowControllerDidLoadNib 中调用 setSortDescriptors(我可能错误地认为这是在基于文档的应用程序中执行此类操作的正确位置。)我刚刚检查过,在调用 [myTableView setSortDescriptors] 后,[myTabeView sortDescriptors] 返回零。在哪里(何时)是进行此类呼叫的正确地点(时间)(或者我应该问一个关于窗口启动时发生的顺序的新问题?)谢谢!
  • 后续:我将对 setSortDescriptors 的调用移动到按钮按下方法中。以编程方式调用 setSortDescriptors 确实会导致调用 sortDescriptorsDidChange,但单击表列标题仍然不会。我是否还需要设置其他内容才能使其正常工作(单击列标题或其他内容的操作)?我从阅读文档中认为没有必要这样做。
  • 检查myTableView 不是nil。这在awakeFromNibwindowControllerDidLoadNib: 中都应该是正确的;前者发生在所有连接都连接好之后,后者发生在笔尖完全加载之后(即,所有东西都连接好了。
  • O.K... (1) 在 windowControllerDidLoadNib 中:tableView 为 nil。 (2) 我添加了一个按钮来切换排序顺序(模拟我期望单击 tableView 列标题执行的操作),此时:(a) tableView 不是 nil,并且 (b) 使用设置排序顺序我在原始问题中发布的代码按预期工作,导致 sortDiscriptorsDidChange: 被调用。但是,实际上单击列标题仍然没有任何作用。到目前为止,我能够通过单击列标题进行表排序的唯一方法是在 Interface Builder 中指定它。

标签: objective-c cocoa sorting nstableview


【解决方案1】:

如果没有这个它应该可以工作,但您是否尝试过自己发送 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];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多