2010-03-12 6 views
5

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

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

Благодаря

ответ

7

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

Создать 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 
} 

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

+0

@ Джордан, спасибо, это та же самая идея, что и у меня, но она создает раздражающее мерцание, когда таблица переходит в режим редактирования, и это не очень естественно. Я думаю, что OP должен внедрить салфетки для удаления, как утверждает Ян Генри или придерживается более стандартного подхода. – DyingCactus

+0

Вы также можете использовать анимацию, но я согласен. – Jordan

+0

Спасибо, Джордан, похоже, работает. :) – msk

3

Реализовать метод editingStyleForRowAtIndexPath:

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

//
//
EDIT: Как вы разъяснены в комментариях, вы хотите, чтобы позволить красть пользователя на ячейку, а затем либо удалите или переместите ячейку.

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

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

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

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

+0

DyingCactus! Это не поможет. Поскольку это только установило бы режим редактирования для строки 3. Я хочу установить режим редактирования для строки, которую пользователь проверил. – msk

+0

Хорошо, извините, неправильно понял ваш вопрос. Таким образом, в основном вы хотите просто поместить таблицу в режим редактирования, когда пользователь нажимает на ячейку? – DyingCactus

+0

Я добавлю способ позже, но сделайте это в любом приложении Apple. Я не уверен, что это следует за HIG. – DyingCactus

2

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

Чтобы быть более понятным. Подкласс 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: анимированный: UITableView. Вызов этого метода с редактированием, установленным в NO, удаляет элементы управления из ячейки ».

Так все, что нужно сделать, это переопределить -setEditing: анимированные: метод в нашем 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, будут доступны для редактирования.

Смежные вопросы