正在重置NSArrayController选择

时间:2011-04-21 20:22:05

标签: objective-c cocoa macos cocoa-bindings

短篇小说:

每当发出setContent时,都会重置NSArrayController的选择。我想知道是否有办法解决这个问题。

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

更新:丑陋的黑客解决方案

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

长篇故事:

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

检查器面板位于单独的nib文件中,我有两个相同的NSArrayControllers,一个来自主文档窗口,另一个来自检查器面板,因此两者都可以与文档交互。这就是我对selectionIndexes进行手动绑定的原因,因此我没有使用两个单独的NSArrayControllers进行两次单独的选择。

检查员小组通过以下方式跟踪正在检查的文件:

Document *inspectedDocument;

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

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

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

1 个答案:

答案 0 :(得分:1)

我仍然不明白它为什么会发生,或者它是否可以关闭,但我使用的解决方案非常简单,我只是在重新连接NSArrayController之前保存选择,然后立即恢复它。 / p>

当更改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];
}