Как показать элементы управления переупорядочением в UITableView с помощью кнопок удаления
Я прочитал документацию о том, как управлять удалением и переупорядочением строк в UITableView. Я создал кнопку редактирования, и я могу удалить строки. Я хотел бы, чтобы пользователь мог изменить порядок строк. Это кажется простым, но я не могу понять, как сообщить ячейкам, что они могут быть перемещены.
Чтобы указать строки, которые они могут быть удалены, я использую editStyleForRowAtIndexPath, но как я могу передать ячейку, которую она также может перемещать, и где я устанавливаю showReorderControl? Я попытался поместить в cellForRowAtIndexPath, но ничего не отображается.
Спасибо!
Ответы
Ответ 1
Вы должны сказать, что строки можно перемещать:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
и реализовать этот делегат для обновления источника данных:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
См. Управление переупорядочением строк Руководство по программированию таблиц для iOS
Ответ 2
В моем случае я применил все необходимые методы UITableViewDelegate, как указано в документе Apple и в ответах здесь, но все еще не может видеть элемент управления переупорядочением. В конце концов я узнал об этом, потому что я перепробовал метод layoutSubviews, не вызывая супер-реализацию по умолчанию. После того, как я добавил [super layoutSubviews], мой контроль над порядком наконец появится.
Причина, по которой нам нужно вызвать [super layoutSubviews], заключается в том, что, когда мы переключаем свойство редактирования таблицы, он вызывает метод layoutSubviews ячейки, а система предоставляет элементы управления, такие как элемент управления переупорядочением, отображается в методе layoutSubviews по умолчанию UITableViewCell. Как только вы это осознаете, вы также можете изменить реализацию layoutSubviews, чтобы изменить внешний вид вашей ячейки в зависимости от того, редактируется она или нет, чтобы сделать ее менее неуклюжей, когда появляется элемент управления переупорядочением.
Итак, вот контрольный список для переупорядочения строк:
- убедитесь, что методы делегата tableView: canMoveRowAtIndexPath и tableView: moveRowAtIndexPath: toIndexPath реализованы
- убедитесь, что для свойства редактирования tableView установлено значение YES
- Если у вас есть пользовательский UITableViewCell, убедитесь, что вы звоните
[super layoutSubviews], если вы переопределите этот метод
Ответ 3
Добавление в @benoit ответа выше. Если ваша модель является изменчивым массивом, для tableView будет достаточно чего-то подобного: moveRowAtIndexPath: toIndexPath:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
id objectToMove = [_objects objectAtIndex:fromIndexPath.row];
[_objects removeObjectAtIndex:fromIndexPath.row];
[_objects insertObject:objectToMove atIndex:toIndexPath.row];
[tableView reloadData];
[self saveObjects]; // A method of your own to make new positions persistent
}
Ответ 4
попробуйте это.,.Это будет обрабатывать размещение и обновление ячейки в случае простого табличного просмотра.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
[tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row];
[tableData removeObjectAtIndex:(sourceIndexPath.row + 1)];
}