我已经将NSArrayController
子类化为自我证明某些事情是错误的
在我的子类中,我覆盖了-setSelectedObjects
:
-(BOOL)setSelectedObjects:(NSArray *)objects
{
NSArray *previousSelected = [[self selectedObjects] copy];
selectionChanged = [super setSelectedObjects:objects];
NSArray *afterSelected = [self selectedObjects];
//Below is a desperate attempt to get my array to set
if( [previousSelected isEqualToArray:afterSelected] )
{
[super removeSelectedObjects:previousSelected];
[super addSelectedObjects:objects];
}
return selectionChanged;
}
以下是我的LLDB输出
在这里,您可以看到我的NSArrayController
在ImageGraphics
中包含两个arrangedObjects
(lldb) po [self arrangedObjects] <_NSControllerArrayProxy
0x6080000146a0>( <ImageGraphic: 0x618000124d80> <{226, 274}> <{318,
178}>, <ImageGraphic: 0x618000124880> <{337, 343}> <{438, 246}> )
在此我们可以看到,在致电[super setSelectedObjects:]
之前,我的selectedObjects
数组中有一个ImageGraphic
:
(lldb) po [self selectedObjects] <__NSArrayI 0x61800003b1e0>(
<ImageGraphic: 0x618000124d80> <{226, 274}> <{318, 178}> )
在这里,您可以看到我的objects
数组,我想要设置的数组作为我的selectedObjects
。请注意ImageGraphic here is the other object that is not currently in
selectedObjects`:
(lldb) po objects
<__NSArrayI 0x60800063ce40>(
<ImageGraphic: 0x618000124880> <{337, 343}> <{438, 246}>
)
现在即使我们可以清楚地看到objects
包含selectedObjects
当前包含的不同对象,-setSelectedObjects
也不会做任何事情。
以下是previousSelected
和selectedObjects
的值我致电[super setSelectedObjects]
(lldb) po previousSelected
<__NSArrayI 0x61800003b1e0>(
<ImageGraphic: 0x618000124d80> <{226, 274}> <{318, 178}>
)
(lldb) po [self selectedObjects]
<__NSArrayI 0x61800003b1e0>(
<ImageGraphic: 0x618000124d80> <{226, 274}> <{318, 178}>
)
没有任何改变。
您还可以看到我绝望地尝试删除并添加selectedObjects
,但即使[super removeSelectedObjects:previousSelected]
也不会影响selectedObjects
。
看来我处于某种状态,selectedObjects
无法修改。这没有任何意义,因为每一套方法都会返回YES
,这意味着它正在运作。
我还尝试覆盖-removeSelectedObjects
,-addSelectedObjects
,看看他们是否在我不知情的情况下被执行。但事实并非如此
有什么理由可以解释为什么NSArrayController
无法在特定时间进行修改?
请注意,这实际上大部分时间都有效
答案 0 :(得分:0)
最终想出这个,
NSGraphicsArrayController
在这里有两个关键属性:
arrangedObjects
和selectedObjects
selectedObjects
数组应该只包含arrangedObjects
所以我们将对象添加到arrangedObjects
,然后selectedObjects
。
添加到选择中的只是特定对象失败
原来这些特定对象被添加到arrangedObjects
到-insertObjects:atIndex:
,而成功添加到选区中的对象是通过-addObjects
添加的
arrangedObjects
中的索引一定出现问题,这让我们感到困惑selectedObjects
因此,解决方案就是在任何地方使用-addObjects
,selectedObjects
始终按照我们的预期更新