Как показать элементы управления переупорядочением в UITableView с помощью кнопок удаления - PullRequest
15 голосов
/ 08 декабря 2010

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

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

Спасибо!

Ответы [ 4 ]

36 голосов
/ 08 декабря 2010

Вы должны сказать, что строки можно перемещать:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
  return YES;
}

и реализовать этот делегат для обновления источника данных:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

См. Управление переупорядочением строк из Руководство по программированию табличного представления для iOS

4 голосов
/ 26 января 2015

В моем случае я реализовал все необходимые методы UITableViewDelegate, как упомянуто в документе Apple и в ответах здесь, но все еще не вижу элемента управления переупорядочением. В конце концов я обнаружил, что это потому, что я переопределил метод layoutSubviews, не вызывая реализацию супер по умолчанию. После того как я добавил [super layoutSubviews], наконец-то появился мой элемент управления переупорядочением.

Причина, по которой нам нужно вызывать [super layoutSubviews], заключается в том, что когда мы переключаем свойство редактирования таблицы, вызывается метод layoutSubviews ячейки, а предоставляемые системой элементы управления, такие как элемент управления переупорядочением, отображаются в методе layoutSubviews по умолчанию UITableViewCell. Как только вы это поймете, вы также можете изменить реализацию layoutSubviews, чтобы изменить внешний вид ячейки в зависимости от того, редактируется она или нет, чтобы сделать ее менее неуклюжей при появлении элемента управления переупорядочением.

Итак, вот контрольный список для переупорядочения строк:

  1. убедитесь, что реализованы методы делегата tableView: canMoveRowAtIndexPath и tableView: moveRowAtIndexPath: toIndexPath
  2. убедитесь, что свойство редактирования tableView установлено в YES
  3. Если у вас есть пользовательский UITableViewCell, обязательно позвоните [super layoutSubviews] если вы переопределите этот метод
2 голосов
/ 04 ноября 2013

попробуйте это.,.eth будет заниматься организацией и обновлением ячейки в случае простого просмотра таблицы

- (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)];
}
2 голосов
/ 23 февраля 2013

Добавление к @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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...