【问题标题】:Restoring the selection in an NSTableView (NSWindowRestoration)恢复 NSTableView 中的选择(NSWindowRestoration)
【发布时间】:2012-08-08 09:37:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: cocoa nstableview nswindowrestoration


    【解决方案1】:

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

    最简单的方法是将您的NSTableViewselectionIndexes 绑定到您的Array 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];
    

    然后检索它们:

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

    【讨论】:

    • 因为我可以有多个窗口并且我已经在使用NSWindowRestoration,所以我使用-window:willEncodeRestorableState:-window:didDecodeRestorableState: 委托方法将它们编码为窗口的可恢复状态,但这绝对是一个好方法方法。谢谢!
    • @BrentRoyal-Gordon 在多个窗口(甚至一个窗口)的情况下,这听起来肯定比写信给NSUserDefaults 顺畅多了,谢谢你让我知道你的方法!
    • 不知何故,当我这样做时(即使使用代码,但我有绑定),TableView 立即为空:( 我在谈论 Vervious 的想法,因为我的应用程序不是 Document - 基于。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多