Режим редактирования Enabling только для одной строки в табличном представлении

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

Существует ли способ обнаружить, какая строка была сильно ударена разрешение режима редактирования только для той строки?

Спасибо

5
задан msk 12 March 2010 в 22:05
поделиться

3 ответа

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

Создайте selectionIndexPath в .h

NSIndexPath *selectionIndexPath;

Затем в .m

- (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
}

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

7
ответ дан 13 December 2019 в 05:33
поделиться

Реализуйте метод EditStyleForRowAtIndexPath:

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

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

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

Альтернативный вариант, предложенный Яном Генри, - реализовать удаление смахивания. Однако, похоже, нет эквивалента смахивания для перемещения. Чтобы реализовать удаление смахивания, сделайте следующее:

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

. появляются справа. Если пользователь нажмет это, будет вызываться commitEditingStyle, а если пользователь нажмет что-нибудь еще, удаление будет отменено.

3
ответ дан 13 December 2019 в 05:33
поделиться

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

Для большей ясности. Подкласс UITableViewCell и поддерживайте в нем bool, например:

@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];
}

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

«Когда вы вызываете этот метод со значением редактирования, установленным на 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, будут доступны для редактирования.

2
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: