2014-08-28 4 views
0

Нормальный выбор ячейки на uitableview работает нормально. Но когда вызывается длинное событие нажатия для ячейки, он снова выбирает ранее выбранную ячейку. Например, если пользователь выбрал первую ячейку, а затем долгое нажатие второй ячейки, событие для длительного нажатия вызывается для второй ячейки, но выбор снова возвращается к первой ячейке.Изменить выбор ячейки при длинном нажатии uiTableView IOS

это мои коды:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

if (cell == nil) { 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    //add longPressGestureRecognizer to your cell 
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleLongPress:)]; 
    //how long the press is for in seconds 
    lpgr.minimumPressDuration = 1.0; //seconds 
    [cell addGestureRecognizer:lpgr]; 

} 


return cell; 
} 

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 

CGPoint p = [gestureRecognizer locationInView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 
if (indexPath == nil) { 
    NSLog(@"long press on table view but not on a row"); 
} 
else 
{ 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"long press on table view at row %ld", (long)indexPath.row); 

     editViewController *editView = [self.storyboard instantiateViewControllerWithIdentifier:@"editView"]; //dont forget to set storyboard ID of you editViewController in storyboard 
     [self.navigationController pushViewController:editView animated:YES]; 
    } 
} 

} 
+0

Переместить код выделения жестов за пределы блока 'if (cell == nil)' и посмотреть, что произойдет. – avismara

ответ

1

кажется, что проблема у вас возникли коренится в том, что маркировка клетки, выбранные и обработки длинного пресс-конференции жеста на том, что ячейки являются отдельными. Моя интерпретация вашего вопроса заключается в том, что у вас есть табличное представление с единственным выбором (не несколько) и что вы хотите, чтобы ячейки стали «выбраны» как с помощью обычного нажатия, так и для выбора действия, а также путем распознавания длинного жестжа. Однако - если вы хотите, чтобы ячейка была выбрана с длинным жестом нажатия, вы хотели бы, чтобы longpress приводил к другому действию, чем выбор через обычный кран (например, если пользователь удаляет ячейку, которую вы хотите запустить контроллер A просмотра, но если пользователь долгое время нажимает на эту ячейку, которую вы хотите запустить контроллер просмотра B, и в обоих случаях вы хотите, чтобы таблица рассматривала ячейку как «выбранную») ... дайте мне знать, если то, что вы хотите, отличается от этого, и я могу обновить ответ.

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

Сначала определите свойство для отслеживания того, что происходит длительное нажатие:

@property (assign, nonatomic) BOOL longPressActive;

Затем в методе handleLongPress, скажите таблицу, чтобы выбрать строку:

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 

    CGPoint p = [gestureRecognizer locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 
    if (indexPath == nil) { 
     NSLog(@"long press on table view but not on a row"); 
    } 
    else 
    { 
     if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
     { 
      NSLog(@"long press on table view at row %ld", (long)indexPath.row); 
      self.longPressActive = YES; 

      [self.tableView selectRowAtIndexPath:indexPath 
             animated:NO 
            scrollPosition:UITableViewScrollPositionNone]; 

     }else if (gestureRecognizer.state == UIGestureRecognizerStateEnded || 
        gestureRecognizer.state == UIGestureRecognizerStateCancelled) { 
      self.longPressActive = NO; 
    } 

} 

Наконец, в вашем table view delegate methods, определите поведение, которое вы ожидаете после выбора. Обратите внимание, что в примере длительное нажатие на любую ячейку приведет к отображению того же дисплея. Чтобы настроить этот контроллер просмотра по-разному, вы можете выполнить процесс, подобный моему ответу, в your prior question, или вы можете передать данные, относящиеся к строке, в editViewController после того, как вы его создадите.

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

    if (self.longPressActive) { //Perform action desired when cell is long pressed 

     editViewController *editView = [self.storyboard instantiateViewControllerWithIdentifier:@"editView"]; 
     [self.navigationController pushViewController:editView animated:YES]; 

    }else { //Perform action desired when cell is selected normally 

     //Your code here 
    } 

} 

Надеюсь, это полезно.

+0

Я использую TableView для отображения основного объекта данных, теперь, если пользователь удаляет ячейку, я хочу запустить EditViewController, но если пользователь долгое время нажимает на эту ячейку, я хочу запустить «Детали этой ячейки», поэтому важно, чтобы была нажата ячейка w ا ich или какая ячейка долгое нажатие, , потому что я хочу передать выбранную ячейку (нажав) в EditViewController и выделенную ячейку (длинным нажатием) в DetailsViewController –

+0

. Этот код должен сделать это. Однако, чтобы уточнить, вы не должны передавать ячейку ни в EditViewController, ни в DetailsViewController, вы должны передавать ссылку на свой основной объект сущности данных. Передача самой ячейки нарушила бы парадигму MVC. – BFar

+0

Теперь я, это мой конкретный вопрос: как изменить выбор ячейки при длительном нажатии? –

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