Включение режима редактирования только для одной строки в табличном представлении - PullRequest
5 голосов
/ 13 марта 2010

Я могу установить режим редактирования на некоторое время uitableview, вызвав [tableView setEditing: YES]; Но это устанавливает режим редактирования для всех строк в таблице.

Есть ли способ определить, какая строка была прокручена, включить режим редактирования только для этой строки?

Спасибо

Ответы [ 3 ]

7 голосов
/ 13 марта 2010

Я не закодировал это, но вот идея.

Создать selectionIndexPath в .h

NSIndexPath *selectionIndexPath;

Тогда в .м

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

сохранить indexPath к selectionIndexPath и вызвать:

[self.tableView setEditing:YES];

Затем в:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

if (selectionPath.row == indexPath.row)
    {
        return UITableViewCellEditingStyleDelete;
    }
    else
    {
        return UITableViewCellEditingStyleNone;     
    }
}

Вы также можете поймать прикосновения, а затем сделать более или менее то же самое. Как то так ...

NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
if (indexPath != nil)
{
        // save indexPath and setEditing Mode here
}

У меня не было времени его кодировать, но это основная идея.

3 голосов
/ 13 марта 2010

Реализация метода editStyleForRowAtIndexPath:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 3)
    {
        return UITableViewCellEditingStyleDelete;
    }
    else
    {
        return UITableViewCellEditingStyleNone;     
    }
}

//
//
РЕДАКТИРОВАТЬ: Как вы пояснили в своих комментариях, вы хотите, чтобы пользователь провел по ячейке, а затем либо удалите, либо переместите ячейку.

Я полагаю, что для того, чтобы пользователь мог выполнять оба действия, необходимо перевести таблицу (не только ячейку) в режим редактирования, и если вы будете делать это только тогда, когда пользователь проведет пальцем по ячейке, при перерисовке таблицы будет раздражающее мерцание. Сам, чтобы освободить место для кнопок вставки / удаления. Джордан предоставил пример кода для этого.

Альтернатива, предложенная Иэном Генри, заключается в том, чтобы внедрить функцию «удаление пальцем». Тем не менее, похоже, что не существует эквивалента смахивания. Чтобы выполнить удаление, выполните следующие действия:

  • держать редактирование таблицы выключенным
  • реализовать editingStyleForRowAtIndexPath и просто return UITableViewCellEditingStyleDelete независимо от указателя пути
  • реализовать willBeginEditingRowAtIndexPath но ничего не делать в нем
  • внедрить commitEditingStyle и удалить из него строку из вашего источника данных и вызвать deleteRowsAtIndexPaths

Теперь, когда пользователь проведет пальцем по ячейке, справа появится кнопка Удалить. Если пользователь коснется этого, будет вызван commitEditingStyle, а если пользователь коснется чего-либо еще, удаление будет отменено.

2 голосов
/ 30 апреля 2010

Существует метод -setEditing:animated: также для UITableViewCell. Поэтому, если вы переопределите его в пользовательском UITableViewCell и отправите сообщение super, только если оно доступно для редактирования, вы сможете достичь того, чего хотите.

Чтобы быть более понятным. Подкласс UITableViewCell и поддержание в нем логического выражения, скажем:

@interface CustomTableViewCell : UITableViewCell 
{
    BOOL cellEditable;
}
@property (readwrite, assign) BOOL cellEditable;

@end

Затем в методе делегата tableview верните объект CustomTabeViewCell со свойством cellEditable, соответствующим образом установленным для строки (независимо от того, является ли эта строка редактируемой или нет).

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *newCell = [[CustomTableViewCell alloc] init];
    if (row_is_editable)
        [newCell setCellEditable:YES];
    else
        [newCell setCellEditable:NO];
    return [newCell autorelease];
}

Согласно документации метода - (void)setEditing:(BOOL)editing animated:(BOOL)animated UITableViewCell -

"Когда вы вызываете этот метод со значением редактирования, установленным на YES, и объект UITableViewCell настроен на использование элементов управления, ячейка показывает элемент вставки (зеленый плюс) или элемент удаления (красный минус) с левой стороны каждого элемента. ячейка и элемент управления переупорядочением на правой стороне. Этот метод вызывается на каждой видимой ячейке при вызове setEditing: animated: метод UITableView. Вызов этого метода с редактированием, установленным на NO, удаляет элементы управления из ячейки. "

Так что все, что нам нужно сделать, это переопределить -setEditing: animated: метод в нашем CustomTableViewCell и выполнить это:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    if ([self cellEditable])
    {
        [super setEditing:editing
                 animated:animated];
    }
    else
    {
        [super setEditing:NO 
                 animated:NO];
    }
}

И все, теперь, когда вы запускаете -setEditing:animated: в своем табличном представлении, только строки, ячейки которых вы указали как cellEditable, будут доступны для редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...