2009-06-16 4 views
13

Эта проблема заставила меня заняться в течение последних часов. У меня есть две секции с одной строкой в ​​каждом разделе. Когда я удаляю строку в одном из разделов, она генерирует исключение, указав, что это недопустимое обновление (количество строк/разделов до и после обновления не совпадает). Это понятно, поскольку я удаляю последнюю строку раздела, и поэтому я исключаю этот раздел. Вопрос заключается в том, как избежать исключения.Как удалить последнюю строку раздела?

Все в порядке с моим источником данных. Я проверил и перепроверял (поверьте мне).

Итак, как говорится в заголовке раздела, как удалить последнюю строку раздела без получения исключения?

Спасибо,

Барт

+0

«название нити» Это вопрос и ответ на сайте, не форум. Вы имеете в виду название вопроса. –

ответ

26

При удалении строки, и эта строка является последней из ее раздела, вам необходимо также удалить раздел. В принципе, вам нужно отслеживать как индексы, которые вы хотите удалить, связанные с строками, так и индексы, относящиеся к разделам, которые необходимо удалить, поскольку они больше не содержат строк. Вы можете сделать это следующим образом:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Каждый раз, когда вы удалите объект из модели массива, относящегося к определенной части Tableview, проверьте, если счетчик массива равен нулю, в этом случае добавить индекс, представляющий раздел индексам:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

Определить все indexPaths относящихся к строкам, которые будут удалены, а затем обновить Tableview следующим образом:

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Это работало для меня и о Я предложил этот подход.

+0

Эта опция работает, хотя при удалении последнего раздела генерируется другое исключение (но я покажу способ решить это). Мне трудно поверить, что это единственный способ. Кажется, что он неспособен/неуравновешен. Это не просто работает ;-). Спасибо за ваш вклад. –

+2

Чтобы добавить к этому, когда я удаляю последнюю строку в разделе, я вызываю только deleteSections: withRowAnimation :. Я не называю deleteRowsAtIndexPaths: withRowAnimation :. Анимация выглядит одинаково, и она не бросает никаких исключений. – Alex

+0

Как вы справляетесь с удалением последней строки последнего раздела? –

1

Возможно, это может работать для вас:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [self.keys objectAtIndex:section]; 
    NSMutableArray *rowsInSection = [self.dict objectForKey:key]; 
    [rowsInSection removeObjectAtIndex:row]; 

    NSUInteger rowsInSectionCount = [rowsInSection count]; 

    if (rowsInSectionCount > 0) { 
     // If we still have rows in this section just delete the row 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    else { 
     // There are no more rows in this section 
     [self.dict removeObjectForKey:key]; 
     [self.keys removeObjectAtIndex:section]; 

     NSUInteger sectionCount = [self.keys count]; 

     if (sectionCount > 0) { 
      // If we still have 1 or more sections left just delete this section 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else { 
      // If there are no more rows and sections left just delete the last row 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView reloadData]; 
     } 
    } 
} 

Надежда это то, что вы искали.

1

Это следует сделать трюк:

// Either delete some rows within a section (leaving at least one) or the entire section. 
    if ([indexPath section] < 0) { 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if ([indexPath section] == 0) { 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
1

Для Swift 2, после удаления данных в модели:

tableView.beginUpdates()      

    let indexSet = NSMutableIndexSet() 
    indexSet.addIndex(indexPath.section) 
    tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade) 

    tableView.endUpdates() 
Смежные вопросы