2016-10-16 3 views
0

Так что у меня сбой приложения каждый раз, когда я пытаюсь удалить последнюю ячейку раздела. .Приложение iOS вылетает после удаления последней ячейки в секции

Ex, если моя секция имеет 10 строк, я могу удалить их без каких-либо проблем, но последний выдает следующее сообщение об ошибке:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of sections. The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (3), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).'

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

Соответствующие части моего кода идет, как следует:

override func numberOfSections(in tableView: UITableView) -> Int { 
    if (main_arr.count > 0 && sub_arr.count > 0) { 
     self.numberOfSections = 3 
    } else { 
     self.numberOfSections = 2 
    } 

    return self.numberOfSections 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if (section == 0) { 
     return 1 
    } else if (section == 1 && main_arr.count > 0) { 
     return main_arr.count 
    } else { 
     return sub_arr.count 
    } 

} 

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 

// Override to support editing the table view. 
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     switch indexPath.section { 

     case 1: 
      main_arr.remove(at: indexPath.row) 

     case 2: 
      sub_arr.remove(at: indexPath.row) 

     default: 
      print("default 001") 
     } 

     tableView.deleteRows(at: [indexPath], with: .fade) 

    } else if editingStyle == .insert { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 

EDIT 1

Я пытался справиться с глобальной переменной, отвечающей за NumberOfSections поэтому, когда любой из моих arrays.count == 0 он будет уменьшен на 1, но это не решило проблему.

Я полностью понимаю сообщение об ошибке, например, если у меня есть 3 раздела, и я удаляю весь контент одного из них, я должен удалить один раздел и удалить его из источника данных.

ответ

2

Проблема заключается в том, что numberOfSections возвращает разные значения до и после удаления строк, но вы не удаляете никаких разделов. Таким образом, вы должны либо вернуть постоянное значение в NumberOfSections или вызвать deleteSections в дополнение к deleteRows

Главное помнить следующее:

UITableView всегда должен содержать одинаковое число строк и разделов, как ваши DataSource.

Вы не можете просто вернуть новое значение в numberOfSections или numberOfRows dataSource. Каждое изменение должно быть компенсировано методом удаления/вставки строк (разделов). И наоборот: если вы удаляете/вставляете в tableView, то должен возвращать соответствующие значения в методах dataSource. Так же, как указано ваше сообщение об исключении:

The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (3), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).

Это потому, что 3 + 0 ≠ 1. В этом случае вы должны были удалить два раздела, чтобы избежать сбоя.

+0

Быстрее меня. :) – Eiko

+0

Итак, вы говорите, что я должен вызвать 'tableView.deleteSections (разделы: IndexSet, с: UITableViewRowAnimation)' после 'tableView.deleteRows (at: [indexPath], с: .fade)', если это было последний ряд? –

+0

Да. Вам также потребуется вставить раздел, если вы получите новую ячейку в секции в какой-то момент после ее удаления. Но я бы предпочел бы иметь 3 раздела, некоторые из которых могут быть пустыми. Будет легче управлять удалением/вставкой, поскольку вы будете работать только с строками, а не с разделами и строками. – alexburtnik

1

Сообщение об ошибке на самом деле очень полезно. Он говорит о разделах - он не должен меняться, но после операции он нашел другое значение.

В основном, UIKit проверял количество разделов и строк перед вызовом кода, запускает ваш код и затем проверяет, соответствуют ли новые номера вашим операциям. В этом случае это не так, потому что вы вызываете deleteRows (что должно уменьшить количество строк для данного раздела), но ваш делегат numberOfSections дает другой результат. Таким образом, вы либо хотите позвонить deleteSections, либо оставить неизменным код раздела.

BTW, не запрещено возвращать 0 как количество строк для раздела - возможно, это именно то, что вы хотите здесь.

Дальнейшее примечание. Я не думаю, что хранение количества разделов в переменной экземпляра - это хорошо. Это делает двойной учет.

+0

ОК. Я попробую его с 3 постоянными разделами и посмотрю, что я могу извлечь из него, и я отвечу вам как можно скорее. –

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