Подтвердить что ты не робот

Как показать элементы управления переупорядочением в UITableView с помощью кнопок удаления

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

Чтобы указать строки, которые они могут быть удалены, я использую editStyleForRowAtIndexPath, но как я могу передать ячейку, которую она также может перемещать, и где я устанавливаю showReorderControl? Я попытался поместить в cellForRowAtIndexPath, но ничего не отображается.

Спасибо!

4b9b3361

Ответ 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)];
}