首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NSArrayController中排序

在NSArrayController中排序
EN

Stack Overflow用户
提问于 2015-04-05 00:23:26
回答 1查看 214关注 0票数 0

我如何才能真正同步NSMutableArray和NSArrayController呢?

我的UI中有类Dialog和NSArrayController,它们将内容数组绑定到Dialog.messages。当我在Dialog.messages中直接添加任何新项目时,它们在NSArrayController中也是可用的,而且一切看起来都很好:

代码语言:javascript
复制
[Dialog addMessage: someMsgItem];

但我也需要排序消息,它只适用于Dialog.messages,而不适用于NSArrayController:

代码语言:javascript
复制
 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey: @"timestamp" ascending: YES];
 _messages = [NSMutableArray arrayWithArray: [_messages sortedArrayUsingDescriptors: @[sort]]];

如何使这些更改也可用于我的NSArrayController?这是Dialog类实现的一部分:

代码语言:javascript
复制
@implementation Dialog
@synthesize messages = _messages; // NSMutableArray

- (void) addMessage:(Message *)msg {
    [self insertObject:msg inMessagesAtIndex:[_messages count]];
}

- (void) removeMessage:(Message *)msg {
    [self removeObjectFromMessagesAtIndex:[self.messages indexOfObject:msg]];
}

- (NSArray *) messages {
    return [_messages copy];
}

- (void) setMessages:(NSArray *)messages {
    [self willChangeValueForKey:@"messages"];
    _messages = [NSMutableArray arrayWithArray:messages];
    [self didChangeValueForKey:@"messages"];
}

- (void) insertObject:(Message *)msg inMessagesAtIndex:(NSUInteger)index {
    [_messages insertObject:msg atIndex:index];
}

- (void) removeObjectFromMessagesAtIndex:(NSUInteger)index {
    [_messages removeObjectAtIndex:index];
}
@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-05 02:03:30

您不需要对_messages数组排序。在数组控制器上设置sortDescriptors,并根据这些描述符对其arrangedObjects进行排序。然后,什么UI (表视图?)绑定到数组控制器的arrangedObjects将自动获取排序顺序。

复杂的是,当您需要查找与UI元素相对应的模型对象(例如表视图中的行)时,需要索引到数组控制器的arrangedObjects,而不是_messages

如果你真的想对_messages排序

  1. 不要像你展示的代码那样替换它。可变数组可以在适当的位置排序,如[someMutableArray sortUsingDescriptors:@[sort]]
  2. 您必须确保在更改_messages时发出KVO更改通知,而不是通过调用一个与KVO兼容的访问器方法。有两种方法可以做到这一点: 打电话给-willChangeValueForKey:-didChangeValueForKey:。例如: self willChangeValueForKey:@"messages";[_messages sortUsingDescriptors:@排序];self didChangeValueForKey:@"messages"; 我不推荐这个选择。它容易出错,并且肯定会生成效率最低的更改通知。 对从-mutableArrayValueForKey:返回的类似数组的可变代理进行操作.例如: [self mutableArrayValueForKey:@"messages“sortUsingDescriptors:@sort]; 至少这会产生更有效的更改通知( NSKeyValueChangeKindKeyNSKeyValueChangeReplacement)。

顺便说一句,不需要-setMessages:方法中调用-willChangeValueForKey:-didChangeValueForKey:,实际上也不需要。因为该方法符合名为"messages“属性的setter的正常命名约定,所以KVO会自动连接到该属性并生成适当的更改通知。(如果希望它不这样做,则必须重写+automaticallyNotifiesObserversForKey:以返回该键的false。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29452845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档