NSArrayController有时候不让我设置`selectedObjects`

时间:2016-08-31 21:04:33

标签: objective-c cocoa

我已经将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输出

在这里,您可以看到我的NSArrayControllerImageGraphics中包含两个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也不会做任何事情。

以下是previousSelectedselectedObjects 的值我致电[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无法在特定时间进行修改?

请注意,这实际上大部分时间都有效

1 个答案:

答案 0 :(得分:0)

最终想出这个, NSGraphicsArrayController在这里有两个关键属性: arrangedObjectsselectedObjects

selectedObjects数组应该只包含arrangedObjects

中存在的对象

所以我们将对象添加到arrangedObjects,然后selectedObjects。 添加到选择中的只是特定对象失败

原来这些特定对象被添加到arrangedObjects-insertObjects:atIndex:,而成功添加到选区中的对象是通过-addObjects添加的

arrangedObjects中的索引一定出现问题,这让我们感到困惑selectedObjects

因此,解决方案就是在任何地方使用-addObjectsselectedObjects始终按照我们的预期更新