2015-02-18 2 views
-1

Вот моя проблема:Удаление объекта из NSMutableArray возвращает исключение после ряда удаляемого

У меня есть NSMutableArray *notes и который является источником моей UITableView* _gradesTV.

Я добавил метод - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath здесь:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSLog(@"%ld", (long)indexPath.section); 
     NSLog(@"%@", notes); 




     [_gradesTV beginUpdates]; 

     [notes removeObjectAtIndex:indexPath.section]; 

     [_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
       withRowAnimation:UITableViewRowAnimationFade]; 

     [_gradesTV endUpdates]; 




     NSLog(@"%@", notes); 
    } 

[_gradesTV reloadData]; 

} 

Но когда я удалить элемент, я получаю эту ошибку:

*** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' 

Но NSLog я делаю на MutableArray показать мне 3 элемента .. .

Линия removeObjectAtIndex на заметках (MutableArray) делает мое приложение аварийным, как будто оно было выполнено дважды ...

Спасибо за вашу помощь ...

Github Link

если и хотят, чтобы вытащить проект и попробовать ...

Вы должны создать сорта с кнопкой +, то вы можете попробовать для удаления элемента в моем представлении таблицы.

При добавлении оценки первый TextField является string, второй - значением double, третий - также значением double.

+0

Разве 'indexPath.section' не должно быть' indexPath.row' –

+0

Можете ли вы отправить все ваши методы 'UITableView delegate'. –

+0

Вы можете вытащить весь проект по этому адресу, если хотите, все предоставленные ответы не работают пока ... [Github Link проекта] (https://github.com/rico237/MyGrades/tree/DeleteRow_UItableView) –

ответ

0

Попробуйте с помощью следующего кода ..

- (NSInteger)numberOfSections { 
    return [notes count]; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSLog(@"%ld", (long)indexPath.section); 
     NSLog(@"%@", notes); 
     [notes removeObjectAtIndex:indexPath.section]; 
     NSLog(@"%@", notes); 
    } 

[_gradesTV reloadData]; 

} 
+0

Спасибо, ваш ответ заставил меня понять, что я не использовал правильный MutableArray (примечания), чтобы получить количество разделов:/ –

+0

Добро пожаловать wolber .. У вас есть решение, которое более важно. –

0

Во-первых удалить UITableView'sbeginUpdates и endUpdates

Во-вторых удалить UITableView'sreloadData, как нет необходимости при использовании UITableViewCellEditingStyleDelete и UITableViewCellEditingStyleInsert

Теперь код будет:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSLog(@"Current Section : %ld", (long)indexPath.section); 
     NSLog(@"Before : %@", notes); 

     [notes removeObjectAtIndex:indexPath.section]; 

     // Either delete some rows within a section (leaving at least one) or the entire section. 
     id sectionDataSource = [notes objectAtIndex:indexPath.section]; 
     if ([sectionDataSource count] > 0) 
     { 
      // Section is not yet empty, so delete only the current row. 
      [_gradesTV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
          withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else 
     { 
      // Section is now completely empty, so delete the entire section. 
      [_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
        withRowAnimation:UITableViewRowAnimationFade]; 
     } 

     NSLog(@"After : %@", notes); 
    } 
} 
+0

IMO Я думаю, что основная проблема заключается в 'indexPath.section'. OP ссылается на раздел, а не на строку ... –

+0

Я уже пробовал этот код, который я нашел в stackoverflow, но это не решило мою проблему, я изменил вопрос и включил ссылку github со всем проектом, если вы хотите попробовать –

0

Проблема в том, что вы удаляете раздел вместо строки.

[notes removeObjectAtIndex:indexPath.section]; должен быть [notes removeObjectAtIndex:indexPath.row];

Также [_gradesTV deleteSections должен быть [_gradesTV deleteRow...

Примечание:Вы должны использовать [_gradesTV deleteRow... или [_gradesTV reloadData];, потому что оба они бесполезны. Я бы сказал, просто использовать [_gradesTV deleteRow...

Также не уверен, что beginUpdates & endUpdates являются для чего. Удалите ненужный материал.

+0

Мой проект работайте больше с разделами, чем строк, и если я использую 'indexPath.row', я не удалю нужный элемент ... Я изменил вопрос, включив ссылку Github проекта, если вы хотите попробовать со всеми файлами –

0

Хорошо, я понял, откуда произошла моя ошибка, просто я не использовал тот же MutableArray, чтобы получить количество разделов ...

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return [notes count]; 
} 

старый метод был старый NSMutableArray я использовал, чтобы проверить свой код ...

Спасибо всем, даже если бы я был просто слишком нуб, чтобы заметить это сам ....