2016-06-27 7 views
0

У меня есть код, который удаляет объект из NSCollectionView, но он удаляет только один элемент. В NSArray («array») значение равно «2 4», которое возвращает 2, 4. Но когда я запускаю код, он удаляет только «2», а не «4».Удалить объект из NSArray по индексу

Журнал:

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

'NSArray' неизменна, так что вы не можете удалить все. – Droppy

+0

Я имею в виду, что ему нужно удалить содержимое коллекции, которое является NSMutableArray. Но все это пишут. Это что-то с этим кодом. –

+0

Вы производите NSString для NSNumber. Очень, очень нездоровый. – gnasher729

ответ

1

Предположим, у вас есть изменяемый массив, содержащий [а, Ь, с, d], индекс 0, b 1, c 2, d 3. Но если вы удаляете элемент say в индексе 1, тогда массив содержит [a, c, d], а в элементах теперь разные индексы a равно 0, c равно 1, а d равно 2 ...

Ваш array представляет собой массив индексов, так что вы попытались удалить элемент с индексом 2 (третий), а затем после этого элемента удаления с индексом 4 (четвертый), но сначала с индексом 5 (как 4> 2) ... Это действительно то, что вы хотите? [e0, e1, e2, 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

Да, он исправлен таким образом из-за моего ответа ниже, но на самом деле он не исправляет проблему, если вы когда-либо захотите удалить многие элементы в виде коллекции – 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 –

 Смежные вопросы

  • Нет связанных вопросов^_^