0

我有一个 NSDictionaries 数组和一个指向数组对象之一的 NSDictionary iVar (*selectedDictionary)。每次用户在 NSTableView 中选择不同的行时,*selectedDictionary 都会指向不同的对象。几个 GUI 控件绑定到 selectedDictionary 实例 (IB)。

每次用户更改上述控件时,我只想使 NSDocument 变脏(编辑)。我认为对数组中的所有对象及其所有 kaypath 使用键值观察有点不够。有什么建议么?

谢谢

4

1 回答 1

0

NSDocument 对将文档标记为脏的支持直接来自 NSUndoManager。将文档更改为脏的最简单的方法是执行 Undo 的实现,这基本上意味着在文档正在使用的模型类(如果您选择处理所有存储,则为 NSDocument 的子类)内部执行撤消直接进去)。

苹果在这里有这方面的文档:http: //developer.apple.com/library/ios/#documentation/cocoa/Conceptual/UndoArchitecture/Articles/AppKitUndo.html

由于您表示您有一系列字典,这将使其实施起来更加困难,但是一旦您确定了这一点,您就会处于良好状态。

或者,如果您不想使用 NSDocument 和 NSUndoManager 提供的免费支持,您可以手动处理 undo 并使用该updateChangeCount:方法修改内部对是否发生更改的理解。这需要一些工作,并且可能比仅正确设置撤消有用得多。

至于观察数组中所有对象的效率,我不会担心,除非您对其进行了分析并发现它效率低下。KVO 真的非常高效,我们定期观察数组的每个元素中的多个值而没有发现性能问题。您必须观察数组本身才能处理添加和删除(假设您的数组有这个)。

不过,据我所知,您有一个selectedDictionary用于确定显示的其他控件的。在这种情况下,您可以使用 KVO 来观察 selectedDictionary 的值,当它发生变化时,您可以从之前的 selectedDictionary 中移除观察者并将它们添加到当前 selectedDictionary 中的键中。无论如何,这基本上就是绑定为了处理显示和设置所做的事情。

这篇 StackOverflow 帖子中引用了我过去使用的另一个考虑因素: NSMutableDictionary KVO。如果您在此处查看我的答案,我将概述在添加新密钥或删除现有密钥时获取通知的技巧。它还具有在有任何更改时向您发出通知的好处。这并不总是一个很好的解决方案,但它确实节省了对要观察的键列表进行编码的一些努力。

除此之外,您还必须添加您希望对文档的已保存状态产生影响的每个键。

于 2012-05-25T18:28:14.367 回答