通过索引从NSArray中删除对象

时间:2016-06-27 14:42:59

标签: objective-c xcode macos nsarray nscollectionview

我有一个代码从NSCollectionView中删除一个对象,但它只删除一个项目。在NSArray("数组")中,值为" 2 4"返回2,4。但是当我运行代码时,它只会删除" 2"而不是" 4"。

日志:

Click here for the image of the NSLOG.

守则

NSString* LibraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPathSMSettings = [LibraryPath stringByAppendingString:stormarManagerSettingsPlistPath];
NSString *betasDef = [SMInAppCommunicationDEF stringByAppendingString:@"BETA App Id"];

NSString *indexOfApp = [Functions readDataFromPlist:plistPathSMSettings ForKey:betasDef];

if (!(indexOfApp == nil)) {
    NSArray * array = [indexOfApp componentsSeparatedByString:@" "];
    NSLog(@"Array: ", array);
    int currentValue = 0;
    for (int i = 0; i < [array count]; i++)
    {
        currentValue = [(NSNumber *)[array objectAtIndex:i] intValue];
        NSLog(@"currentValue: %d", currentValue); // EXE_BAD_ACCESS
            NSLog(@"x: %d", i);
            [self.content removeObjectAtIndex:(currentValue)];
            [self.collectionView setContent:self.content];
            [self.collectionView reloadData];
            NSLog(@"next: %d", currentValue); // EXE_BAD_ACCESS

    }
}
else if (indexOfApp == nil) {
    [self.collectionView setContent:self.content];
    [self.collectionView reloadData];
}

2 个答案:

答案 0 :(得分:1)

假设你有一个包含[a,b,c,d]的可变数组,a的索引是0,b 1,c 2,d 3.但是如果你在索引1处删除了say元素,那么数组包含[a,c,d]和元素现在有不同的索引a是0,c是1,d是2 ...

您的array是一个索引数组,因此您尝试删除索引2处的元素(第三个),然后删除索引4处的删除元素(第四个)但最初删除索引5(如4&gt; 2)......这真的是你想要的吗? [e0,e1,e2,e3,e4,e5,e6 ......] - &gt;在索引2处删除 - &gt; [e0,e1,e3,e4,e5,e6 ......] ---&gt;在索引4处删除 - &gt; [e0,e1,e2,e3,e4,e6 ......]?

- 添加解决方案 -

一个好的解决方法是按降序索引进行排序,然后删除元素,即如果索引为[5,2,7,1] - > sort [7,5,2,1] - &gt;删除第8,然后是第6,然后是第3和第2。这样可以确保删除给定索引处的元素不会更改前面元素的索引。

答案 1 :(得分:-1)

这就是发生的事情,让我们说内容是这样的:

 0  1  2  3  4
[A][B][C][D][E]

如你所说,你的阵列是2,4。然后在第一次迭代中,应该删除2:

 0  1  2  3  4
[A][B][ ][D][E]

现在的内容是:

 0  1  2  3
[A][B][D][E]

由于元素已被删除,内容的长度已经改变,如果您现在尝试在4处删除元素,则不会发生任何事情,因为该位置没有元素。

在开始从内容中删除数组之前,请尝试对其进行排序:

NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];

然后从sortedArray中删除元素,而不是从数组

中删除元素