2012-08-08 63 views
4

我正在开发基于非文档的Cocoa应用程序中的窗口恢复。该应用程序有一个类似Mail.app的界面。每个窗口代表一个帐户;该窗口中的侧边栏列出了该帐户中的对话,主区域列出了所选对话中的消息。恢复NSTableView中的选择(NSWindowRestoration)

这些列表中的每一个都是基于视图的NSTableView。会话列表绑定到NSArrayController,其contentSet绑定到窗口控制器的account属性;消息列表绑定到第二个NSArrayController,其contentSet绑定到第一个NSArrayController的选择。

我已经完成了窗口恢复工作,重新打开所有窗口并将它们与帐户对象重新关联,但我不知道如何恢复表视图的选择。这似乎不会自动发生 - 当窗口恢复时,选择一个对象,但它不是先前选定的对象。这里发生了什么?什么是最简单的方法来保存和恢复选择?

回答

4

如您所知,NSTableView不会自动保存选择。

最简单的方法是绑定你的NSTableViewselectionIndexesArray ControllerselectionIndexes,并保存/从NSUserDefaults检索值。然后,您可以将阵列控制器的selectionIndexes绑定到Shared User Defaults Controller(控制器密钥values,您可以将您的Model Key Path命名为任何内容)。由于NSIndexSet需要存档/取消存档,请使用NSKeyedUnarchiveFromData值转换器。这本身就应该起作用。


如果你遇到了麻烦,就像我与选择指数复位,因为表视图没有立即重新填充(我怀疑你有这些问题,因为你绑定的填充)一样,可以节省手动默认。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setValue:[NSKeyedArchiver archivedDataWithRootObject:self.arrayController.selectionIndexes] valueForKey:vvLastSavedSelectionIndex]; 

和检索他们:willEncodeRestorableState:

NSIndexSet *selectionIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] valueForKey:vvLastSavedSelectionIndex]]; 
[self.arrayController setSelectionIndexes:selectionIndexes]; 
+0

因为我可以有多个窗口,我已经使用'NSWindowRestoration',我使用'-window编码他们到窗口的可恢复状态'和'-window:didDecodeRestorableState:'委托方法,但这绝对是一个好方法。谢谢! – 2012-08-09 05:25:35

+0

@ BrentRoyal-Gordon在多个窗口(甚至一个窗口)的情况下,这听起来比写入'NSUserDefaults'更平滑,谢谢你让我知道你的方法! – Vervious 2012-08-09 05:57:42

+0

不知何故,当我做到这一点(即使与代码,但我有绑定),TableView立即是空的:(我说的是Vervious的想法,因为我的应用程序不是基于文档的。 – 2012-11-22 16:58:55