我有一个NSDictionaries数组和一个指向数组对象之一的NSDictionary iVar(* selectedDictionary)。 *每次用户在NSTableView中选择不同的行时,selectedDictionary指向不同的对象。几个GUI控件绑定到selectedDictionary实例(IB)。
我只是想在每次用户改变上述控件时使NSDocument变脏(编辑)。我认为对数组中的所有对象及其所有kaypath使用Key Value Observing有点不足。有什么建议吗?
由于
答案 0 :(得分:0)
NSDocument支持将文档标记为脏,这直接来自NSUndoManager。将文档更改为脏的最简单方法是执行撤消操作,这基本上意味着在文档正在使用的模型类中进行撤消(如果您选择处理所有存储,则执行NSDocument的子类)直接在那里)。
Apple有关于此的文档: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/UndoArchitecture/Articles/AppKitUndo.html
由于你表明你有一系列词典,这将使它更加有效地实现,但是一旦你钉了它,你就会处于良好的状态。
或者,如果您不想使用NSDocument和NSUndoManager提供的免费支持,您可以手动处理撤消并使用updateChangeCount:
方法修改内部对是否发生更改的理解。这需要一些工作,而且可能没有正确设置撤销那么有用。
至于观察数组中所有对象的效率,除非你对它进行了分析并发现它效率低下,否则我不会担心它。 KVO非常有效,我们经常在数组的每个元素中观察到多个值,而不会出现性能问题。你必须观察数组本身才能处理添加和删除(假设你的数组有这个)。
据我所知,你有一个selectedDictionary
,用于确定显示的其他控件。在这种情况下,您可以使用KVO来观察selectedDictionary的值,当它发生更改时,您可以从先前selectedDictionary中删除观察者,并将它们添加到当前selectedDictionary中的键中。无论如何,这基本上是绑定正在处理显示和设置的行为。
我在过去使用的另一个考虑因素在此StackOverflow帖子中引用: NSMutableDictionary KVO。如果你在这里查看我的答案,我概述了在添加新密钥或删除现有密钥时获取通知的技巧。当有任何变化时,它还可以为您提供通知。它并不总是一个很好的解决方案,但它确实在编写要观察的密钥列表方面做了一些努力。
除此之外,您还必须添加您期望对文档的已保存状态产生影响的每个键。