Я могу установить режим редактирования некоторое время uitableview путем вызова [tableView setEditing:YES]; Но это устанавливает режим редактирования для всех строк в таблице.
Существует ли способ обнаружить, какая строка была сильно ударена разрешение режима редактирования только для той строки?
Спасибо
Я не закодировал это, но вот идея.
Создайте 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
}
Не было времени кодировать, но это основная идея.
Реализуйте метод EditStyleForRowAtIndexPath:
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 3)
{
return UITableViewCellEditingStyleDelete;
}
else
{
return UITableViewCellEditingStyleNone;
}
}
//
//
РЕДАКТИРОВАТЬ: как вы пояснили в своих комментариях, вы хотите, чтобы пользователь проводил пальцем по ячейке, а затем либо удалял, либо перемещал ячейку.
Я считаю, что для того, чтобы позволить пользователю делать и то, и другое, таблица (а не только ячейка) должна быть переведена в режим редактирования, и если вы сделаете это только тогда, когда пользователь проведет по ячейке, будет раздражающее мерцание при перерисовке таблицы. сам, чтобы освободить место для кнопок вставки / удаления. Джордан предоставил для этого образец кода.
Альтернативный вариант, предложенный Яном Генри, - реализовать удаление смахивания. Однако, похоже, нет эквивалента смахивания для перемещения. Чтобы реализовать удаление смахивания, сделайте следующее:
EditStyleForRowAtIndexPath
и просто вернуть UITableViewCellEditingStyleDelete
независимо от пути к индексу willBeginEditingRowAtIndexPath
, но ничего не делает в нем commitEditingStyle
и в нем удаляет строку из вашего источника данных и вызывает deleteRowsAtIndexPaths
. появляются справа. Если пользователь нажмет это, будет вызываться commitEditingStyle, а если пользователь нажмет что-нибудь еще, удаление будет отменено.
Также существует метод -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, будут доступны для редактирования.