【问题标题】:NSArrayController selection being resetNSArrayController 选择被重置
【发布时间】:2011-04-21 20:22:05
【问题描述】:

短篇小说:

每当发出 setContent 时,NSArrayController 的选择就会被重置。我想知道是否有办法关闭它。

当然,如果我让 NSArrayController 使用它的内部 selectionIndexes,这将是唯一可接受的行为,因为那样它就无法同时跟踪两者。但是, selectionIndexes 也被重新连接,这部分顺利进行。不过,它仍然觉得需要重置选择。

更新:Ugly hack 解决方案

我已将此移至答案。不过,我很高兴看到另一个更有见地的答案。

长篇大论:

我有一个基于 Cocoa 文档的应用程序,它带有一个在文档之间共享的检查器面板(以 xcode 附带的 TextEdit 源代码为模型)。在 Document 类中,我有一个 NSMutableArray 和一个 NSMutableIndexSet,它们通过绑定链接到 NSArrayController。

检查器面板位于一个单独的 nib 文件中,我有两个相同的 NSArrayController,一个来自主文档窗口,一个来自检查器面板,因此两者都可以与文档交互。这就是我手动绑定到 selectionIndexes 的原因,这样我就不会使用两个单独的 NSArrayController 获得两个单独的选择。

检查器面板会跟踪以下人员正在检查的文档:

Document *inspectedDocument;

每当文档切换时更新,或者根本没有文档有焦点。一个 NSObjectController 链接到inspectedDocument,而我之前提到的 NSArrayController 链接到那个控制器。

现在,我的问题是当检查器面板就位时,inspectedDocument 被更改,选择索引被重置。如果我不使用检查器面板,问题就会消失,所以我假设是它的 NSArrayController 发出了这个重置。我没有任何控件可以绑定到选择并且可以更改它(例如表格视图)。

在检查器面板的 NSArrayController 中,如果我勾选了“避免空选择”,则选择重置为第一个对象,否则重置为无选择,因此这绝对是选择的合法重置。实际上,我什至不希望检查器面板能够更改选择,所以理想情况下,我想为 NSArrayController 的选择索引建立一个只读绑定。

【问题讨论】:

  • 感谢您将短版移到了前面,但这仍然有点密集。我已经读过几次了,听起来您是在说阵列控制器的选择会在其内容发生变化时发生变化,而您不希望这样,这根本没有任何意义。如何在不同的内容中保留选择?
  • 因为选择存储为 Document 类中的 NSMutableIndexSet。所以两个文档有单独的选择索引,我希望在它们之间切换时保留它们。很抱歉不清楚,这是一个很难描述的问题,我会在了解更多时尝试修改。
  • 知道了;我想可能是这样,但这两者之间的联系并不十分明确。这一个有趣的问题。没必要道歉;我只是认为,如果您再次修改它,对不清楚的地方发表评论可能会对您有所帮助。
  • 感谢您的意见!我现在已经更新了我的问题,希望能更清楚一点。我还添加了一个似乎有效的技巧,但我仍然不知道为什么会发生重置。

标签: objective-c cocoa macos cocoa-bindings


【解决方案1】:

我还是不明白为什么会这样,或者是否可以关闭,但是我使用的解决方案很简单,我只是在重新连接 NSArrayController 之前保存选择,然后立即恢复。

inspectedDocument 被更改并且选择被重置时调用:

NSIndexSet *indexSet = nil;
if (inspectedDocument != doc) {
    indexSet = [doc.selectedIndexes copy]; // Backup selection
}

[self setValue:doc forKey:@"inspectedDocument"]; // Selection is reset here

if (indexSet) {
    // The following function basically does doc.selectedIndexes = indexSet;
    [inspectedDocument selectObjectsAtIndices:indexSet]; // Restore selection
    [indexSet release];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多