短篇小说:
每当发出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的选择索引建立只读绑定。
答案 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];
}