我如何才能真正同步NSMutableArray和NSArrayController呢?
我的UI中有类Dialog和NSArrayController,它们将内容数组绑定到Dialog.messages。当我在Dialog.messages中直接添加任何新项目时,它们在NSArrayController中也是可用的,而且一切看起来都很好:
[Dialog addMessage: someMsgItem];但我也需要排序消息,它只适用于Dialog.messages,而不适用于NSArrayController:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey: @"timestamp" ascending: YES];
_messages = [NSMutableArray arrayWithArray: [_messages sortedArrayUsingDescriptors: @[sort]]];如何使这些更改也可用于我的NSArrayController?这是Dialog类实现的一部分:
@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发布于 2015-04-05 02:03:30
您不需要对_messages数组排序。在数组控制器上设置sortDescriptors,并根据这些描述符对其arrangedObjects进行排序。然后,什么UI (表视图?)绑定到数组控制器的arrangedObjects将自动获取排序顺序。
复杂的是,当您需要查找与UI元素相对应的模型对象(例如表视图中的行)时,需要索引到数组控制器的arrangedObjects,而不是_messages。
如果你真的想对_messages排序
[someMutableArray sortUsingDescriptors:@[sort]]。_messages时发出KVO更改通知,而不是通过调用一个与KVO兼容的访问器方法。有两种方法可以做到这一点:
打电话给-willChangeValueForKey:和-didChangeValueForKey:。例如:
self willChangeValueForKey:@"messages";[_messages sortUsingDescriptors:@排序];self didChangeValueForKey:@"messages";
我不推荐这个选择。它容易出错,并且肯定会生成效率最低的更改通知。
对从-mutableArrayValueForKey:返回的类似数组的可变代理进行操作.例如:
[self mutableArrayValueForKey:@"messages“sortUsingDescriptors:@sort];
至少这会产生更有效的更改通知( NSKeyValueChangeKindKey是NSKeyValueChangeReplacement)。顺便说一句,不需要在-setMessages:方法中调用-willChangeValueForKey:和-didChangeValueForKey:,实际上也不需要。因为该方法符合名为"messages“属性的setter的正常命名约定,所以KVO会自动连接到该属性并生成适当的更改通知。(如果希望它不这样做,则必须重写+automaticallyNotifiesObserversForKey:以返回该键的false。)
https://stackoverflow.com/questions/29452845
复制相似问题