Старый вопрос, я знаю, но я только что реализовал кое-что, что делает это сам, поэтому я хотел поделиться ответом на случай, если это поможет другим, кто наткнется на это.
Мой основной подход заключался в добавлении строки, представляющей раздел, в верхней части каждого раздела. Я также добавил строку «Добавить новый раздел» со стилем редактирования UITableViewCellEditingStyleInsert
в конце каждого раздела, чтобы разрешить создание новых разделов непосредственно в представлении. Итак, для каждого раздела строки были такими:
- Строка 0 = Строка сечения (визуально различается путем установки различных
цвет фона)
- Строки от 1 до x = обычные строки данных
- Row x + 1 = "Добавить новый раздел"
(У меня есть пара простых методов для перевода между «режимом редактирования indexPath» и «указателем реальных данных».)
Для перемещающихся секций, предлагаемое перемещение проверяется в методе UITableViewDelegate Protocol
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
, чтобы убедиться, что ряд секций переместился «достаточно далеко» (выше или ниже другой строки секций). Возвращаемый indexPath обрезается чуть выше или чуть ниже ближайшей строки раздела (в зависимости от того, перемещается ли он вверх или вниз), чтобы дать пользователю визуальную индикацию того, куда он будет перемещен.
В tableView:moveRowAtIndexPath:toIndexPath:
изменение источника выполняется в источнике данных, затем в tableView отправляется сообщение reloadData
для отображения изменения. reloadData
используется вместо moveSection:toSection:
, поскольку в последнем случае источник данных и отображение будут не синхронизированы из-за перемещения строки и вызовут исключение.