我有一个代码从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];
}
答案 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中删除元素,而不是从数组
中删除元素