gpt4 book ai didi

cocoa - 设置和维护 NSTableView 的第一个 SortDescriptor

转载 作者:行者123 更新时间:2023-12-03 17:25:09 24 4
gpt4 key购买 nike

我有一个 NSTableView,其列绑定(bind)到 NSArrayController

表格 View 显示电子邮件列表:

  • 标记未读
  • 主题
  • 附件大小

用户可以单击“附件大小”列对列表进行排序,但我希望表格始终首先按“未读”标志排序,以便未读邮件始终保留在列表顶部。

我没有将数组 Controller 的排序描述符绑定(bind)到任何东西,但是通过单击表列,表排序可以神奇地工作(为什么?)。有什么方法可以拦截设置数组 Controller 的排序描述符并首先插入“未读”排序描述符?

按附件大小排序的表格示例:

UNREAD▼ SUBJECT ATTACHMENT SIZE▼
------ ------- ------------------
yes Hello.. 110kb
yes Test... 90kb

no Foobar 200kb
no Hey 100kb
no Test2 10kb

最佳答案

嗯,它“正常工作”的原因是因为表列在其绑定(bind)的 NSArrayController 上调用 setSortDescriptors:

假设您希望表格保持可排序,但您总是想按“未读”排序,这就是我的做法:

首先,子类 NSArrayController 并覆盖 arrangeObjects:

- (NSArray *)arrangeObjects:(NSArray *)objects {

NSMutableArray *oldSorted = [[super arrangeObjects:objects] mutableCopy];
NSMutableArray *newSorted = [NSMutableArray arrayWithCapacity:[oldSorted count]];

for (id anObject in oldSorted)
if ([[anObject valueForKey:@"isUnread"] boolValue])
[newSorted addObject:anObject];

[oldSorted removeObjectsInArray:newSorted];
[newSorted addObjectsFromArray:oldSorted];
[oldSorted release];

return newSorted;
}

这会将未读消息放在“顶部”(数组的开头)。我不确定这是最有效的排序算法,但我相信这是正确的方法。

关于cocoa - 设置和维护 NSTableView 的第一个 SortDescriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8400961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com