2016-06-27 5 views
0

NSCollectionView에서 객체를 제거하는 코드가 있는데 하나의 항목 만 제거합니다. NSArray ("array")의 값은 2, 4를 반환하는 "2 4"입니다.하지만 코드를 실행하면 "4"가 아니라 "2"만 제거됩니다.NSArray에서 인덱스로 객체 제거

로그 :

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

'NSArray'는 불변, 그래서 당신은 아무것도를 제거 할 수 없습니다. – Droppy

+0

나는 collectionview 콘텐트에서 삭제할 필요가 있음을 의미한다. NSMutableArray이다. 그러나 thats는 모두 씁니다. 이 코드가있는 것입니다. –

+0

NSString을 NSNumber로 형 변환하고 있습니다. 매우, 매우 건강에 해 롭습니다. – gnasher729

답변

1

당신은 여기서 A, B, C, D, 인덱스를 포함하는 가변 배열을 가정

Click here for the image of the NSLOG.

규범 그러나 인덱스 1에서 say 요소를 제거하면 배열에 [a, c, d]가 포함되고 요소에는 이제 다른 인덱스가 있습니다. a는 0이고 c는 1이고 d는 2입니다. ...

귀하의 array은 색인 배열이므로 색인 2 (세 번째)에서 요소를 제거하려고 시도한 다음 색인 4 (네 번째)에서 제거 요소를 제거하지만 처음에는 색인 5 (4> 2) ... 정말 그게 네가 원하는거야? [e0, e1, e3, e4, e5, e6 ...] -> 인덱스 2에서 제거 -> [e0, e1, e3, e4, e5, e6 ...] 인덱스 4 -> [e0, e1, e2, e3, e4, e6 ...]?

--add solution--

좋은 수정 위해 인덱스를 내림차순으로 정렬되고 그들 요소를 제거, 즉 인덱스는 경우 [5,2,7,1] -> 정렬 [7 , 5, 2, 1] -> 제거 8, 6, 그 다음 3 다음 2. 이렇게하면 주어진 인덱스에서 요소를 제거해도 이전 요소의 색인이 변경되지 않습니다.

+0

번호를 전환하여 문제를 해결했습니다. 첫 번째 4 다음 2. 그래서 "4 2" –

+0

예 ofc 그 아래에 내 대답 때문에 그 고정 된 그런 식으로 있지만 컬렉션보기에서 많은 요소를 제거하려는 경우 실제로 문제를 해결하지 않습니다 – Hazneliel

-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에서 요소를 제거

+0

아니요 수정하지 않습니다 올바르게, 당신의 경우 4와 2를 제거하는 것에 대해 생각해보십시오. 'currentValue - i'는 전혀 (2^4의 특별한 경우를 기대합니다) 전혀 표현하지 않습니다. 올바른 수정은 내림차순 인덱스에서 너무 정렬되어 하나씩 제거합니다. –

+0

당신이 맞아요, 제 제안 된 수정을 제거합니다. – Hazneliel

+0

그걸로 일하고 있어요. 1,3,4 –