Как прокрутить tableviewcell для определенной строки в разделе

У меня есть пользовательский UITableview, который разбит на разделы, я внедрил в него UISwipeGestureRecognizer. Когда я прокручиваю ячейку представления таблицы, появляется UIButton. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я прокручиваю первую ячейку представления таблицы, другая ячейка в последовательных разделах также распознает жест пролистывания. Я не могу найти, как провести пальцем по ячейке определенного раздела, чтобы другие ячейки других разделов не были удалены.

Я просто хочу провести пальцем, я не хочу удалять/вставлять или добавлять галочки.

ОБНОВЛЕНИЕ.... Это мой customCell.m Tableview = customTableView

       - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
        {
            self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
            if (self)
            {
                self.backgroundColor = [UIColor clearColor];
                self.contentView.backgroundColor = [UIColor clearColor];

                self.symptomCellImageView.contentMode=UIViewContentModeScaleToFill;


                swipeButton = [[UIButton alloc]init];
                swipeButton .frame = CGRectMake(220.0, 8.0, 30.0, 30.0);
                swipeButton .hidden = NO;

}

В моем MainViewController.m

  -(void)viewDidLoad
    {        

         symptomSwipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandleLeft)];
         symptomSwipeLeft .numberOfTouchesRequired = 1;
         symptomSwipeLeft .direction = UISwipeGestureRecognizerDirectionLeft;
         [customTableView addGestureRecognizer:symptomSwipeLeft];
         [self addGestureRecognizer:symptomSwipeRight];

          symptomSwipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandleRight)];
           symptomSwipeRight.numberOfTouchesRequired = 1;
           symptomSwipeRight.direction = UISwipeGestureRecognizerDirectionRight;
           [customTableView addGestureRecognizer:symptomSwipeRight];
           [self addGestureRecognizer:symptomSwipeRight];

    }


- (void)swipeHandleLeft:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer
{
     CGPoint location = [aSwipeGestureRecognizer locationInView:customTableView ];
     NSIndexPath * indexPath = [customTableView indexPathForRowAtPoint:location];

     if(indexPath)
{
        UITableViewCell * cell = (UITableViewCell *)[customTableView cellForRowAtIndexPath:indexPath];
       [cell.swipeButton addTarget:self action:@selector(secondPageButton:) forControlEvents:UIControlEventTouchUpInside];

              }
}



- (void)swipeHandleRight:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer
 {
     CGPoint location = [aSwipeGestureRecognizer locationInView:customTableView ];
     NSIndexPath * indexPath = [customTableViewindexPathForRowAtPoint:location];

     if(indexPath)
{
       UITableViewCell * cell = (UITableViewCell *)[customTableView cellForRowAtIndexPath:indexPath];
        [cell.swipeButton addTarget:self action:@selector(secondPageButton:) forControlEvents:UIControlEventTouchUpInside];
              }
 }

person raptor    schedule 22.04.2013    source источник


Ответы (2)


Пытаться:

- (void)handleSwipe:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer; {
  CGPoint location = [aSwipeGestureRecognizer locationInView:_tableView];
  NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:location];

  if(indexPath){
    UITableViewCell * cell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:indexPath];
    [cell whateverMethodYouWant];
  }
}

В качестве примечания: причина, по которой вы получаете вызовы в несколько ячеек, заключается в том, что строка недостаточно уникальна. Во всех ваших разделах есть row = 0. Следовательно, если вы хотите, чтобы каждая ячейка имела уникальный номер, прикрепленный к ее свойству .tag, вам нужно знать наибольшее количество строк в любом разделе (назовем его largestNumberOfRows), а затем вычислить:

cell.swipeButton.tag = (indexPath.section * largestNumberOfRows) + indexPath.row;

Надеюсь, это поможет!

ИЗМЕНИТЬ:

Чтобы использовать описанный выше метод, в свой метод viewDidLoad; добавьте следующий код:

UISwipeGestureRecognizer * recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft)];
[_tableView addGestureRecognizer:recognizer];

ИЗМЕНИТЬ 2

Глядя на свой код, вы поместили свои распознаватели жестов не в тот файл. Вот настройка:

В вашем файле MainViewController.m:

- (void)viewDidLoad; {
  [super viewDidLoad];
  UISwipeGestureRecognizer * recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
  [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft)];
  [_tableView addGestureRecognizer:recognizer];
}

- (void)handleSwipe:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer; {
  CGPoint location = [aSwipeGestureRecognizer locationInView:_tableView];
  NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:location];

  if(indexPath){
    UITableViewCell * cell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:indexPath];

    if(aSwipeGestureRecognizer.direction == UISwipeGestureRecognizerDirectionRight){
      [cell symptomCellSwipeRight];
    }
    else if(aSwipeGestureRecognizer.direction == UISwipeGestureRecognizerDirectionLeft){
      [cell symptomCellSwipeLeft];
    }
  }
}

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; {
  // Initial your cell. Then add:
  [cell.swipeButton addTarget:self action:@selector(secondPageButton:) forControlEvents:UIControlEventTouchUpInside];
}

В вашем файле PPsymptomTableCell.m:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier; {
  if((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])){
    self.backgroundColor = [UIColor clearColor];
    self.contentView.backgroundColor = [UIColor clearColor];

    self.symptomCellImageView.contentMode=UIViewContentModeScaleToFill;

    // SHARE ON FACEBOOK BUTTON //

    shareFacebookButton = [[UIButton alloc]init];
    shareFacebookButton.frame = CGRectMake(220.0, 8.0, 30.0, 30.0);
    shareFacebookButton.hidden = NO;

    // DISPLAY NOTIFICATION IMAGE //

    selectedCellImageDisplay = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"selectedSymptomImage.png"]];
    selectedCellImageDisplay.frame = CGRectMake(240.0, 8.0, 30.0, 30.0);

    // SYMPTOM NAME //

    symptomCellLabel=[[UILabel alloc]initWithFrame:CGRectMake(15.0,0.0 ,280.0,40.0)];
    symptomCellLabel.font=[UIFont fontWithName:@"Rockwell" size:17];
    symptomCellLabel.textColor=[UIColor blackColor];
    symptomCellLabel.backgroundColor=[UIColor clearColor];

    [self.contentView addSubview:symptomCellLabel];
    [self.contentView addSubview:selectedCellImageDisplay];
    [self.contentView addSubview:shareFacebookButton];
  }
  return self;
}

- (void)symptomCellSwipeLeft; {
  [UIView beginAnimations:@"HideView" context:nil];
  symptomCellLabel.frame = CGRectMake(-183.0, 0.0, 280.0, 40.0);
  selectedCellImageDisplay.frame = CGRectMake(-340.0, 8.0, 30.0, 30.0);
  shareFacebookButton.frame = CGRectMake(120.0, 8.0, 80.0, 30.0);
  shareFacebookButton.hidden = NO;
  shareFacebookButton.backgroundColor = [UIColor redColor];

  [UIView setAnimationDuration:0.3f];
  [UIView commitAnimations];
}


- (void)symptomCellSwipeRight; {
  [UIView beginAnimations:@"HideView" context:nil];
  symptomCellLabel.frame = CGRectMake(15.0,0.0 ,280.0,40.0);
  selectedCellImageDisplay.frame = CGRectMake(240.0, 8.0, 30.0, 30.0);
  shareFacebookButton.frame = CGRectMake(220.0, 8.0, 30.0, 30.0);
  shareFacebookButton.hidden = YES;

  [UIView setAnimationDuration:0.3f];
  [UIView commitAnimations];
}

Это должно заставить все работать хорошо.

person msgambel    schedule 22.04.2013
comment
.. не следует ли мне вызвать [cell.swipeButton addTarget:self action:@selector(intoView:) forControlEvents:UIControlEventTouchUpInside] в cellForRowAtIndexPath, и тег должен быть сделан в cellForRowAtIndexPath правильно - person raptor; 22.04.2013
comment
Мой код возьмет ваш UISwipeGestureRecognizer и даст вам точную ячейку, на которую пользователь проводит пальцем. Оттуда вы можете вызвать любой метод, который вам нравится. Поэтому, если вы хотите, чтобы кнопка смахивания отображалась, просто вызовите cell.swipeButton.hidden = !cell.swipeButton.hidden (это сделает кнопку видимой, если она скрыта, или наоборот). Вы даже можете вызвать пользовательский метод ячейки, чтобы заставить кнопку анимироваться! Нет необходимости в свойстве .tag вообще! - person msgambel; 22.04.2013
comment
Спасибо :) ... я посмотрю на это ... еще одна вещь, если я проведу по ячейке в 1-м разделе, тогда ячейка в других разделах не будет правильно проведена - person raptor; 22.04.2013
comment
Нет, код, который я вам дал, выберет только 1 ячейку, поэтому никакие другие ячейки не будут изменены. - person msgambel; 22.04.2013
comment
Да, но это для другого вопроса. - person msgambel; 22.04.2013
comment
@msgambel .. это не сработало .. он не вызывал метод ... как насчет наибольшихNumberOfRows = 0 ... должен ли я инициализировать это в handleSwipeMethod ? моя tableviewcell - это пользовательская ячейка - person raptor; 23.04.2013
comment
Каков ваш метод secondPageButton? - person msgambel; 23.04.2013
comment
secondPageButton переходит на страницу facebook ..... где я ошибся? .. я добавил кнопку swipebutton в customcell - person raptor; 23.04.2013
comment
Когда вы пишете [cell.swipeButton addTarget:self action:@selector(secondPageButton:) forControlEvents:UIControlEventTouchUpInside];, вы добавляете метод в качестве цели, которую кнопка будет вызывать, когда пользователь прикасается к ней внутри. Если вы хотите вызвать метод при свайпе, используйте: [self secondPageButton];. - person msgambel; 23.04.2013
comment
.....позвольте мне, где я ошибаюсь в customcell.mfile объявлена ​​кнопка смахивания, объявлен метод дескриптора смахивания (как будет я вызываю метод secondPageButton, так как он объявлен в файле mainViewController.m) MainViewController - объявлен метод secondPageButton - person raptor; 24.04.2013
comment
handleSwipe: также должен быть объявлен в вашем файле MainViewController.m. Если вы хотите активировать кнопку при свайпе, позвоните по номеру [self secondPageButton];. Если вы хотите скрыть/отобразить кнопку при пролистывании, используйте: cell.swipeButton.hidden = !cell.swipeButton.hidden, а в методе cellForRowAtIndexPath: добавьте [cell.swipeButton addTarget:self action:@selector(secondPageButton:) forControlEvents:UIControlEventTouchUpInside];. Это приведет к тому, что кнопка отобразится, а затем, если пользователь коснется кнопки, будет вызван метод secondPageButton:. - person msgambel; 24.04.2013
comment
Я открыл ссылку и разместил код, необходимый для решения проблемы, в моем ответе в разделе Редактировать 2. - person msgambel; 24.04.2013
comment
Вам больше не нужно этого делать. Приведенные выше методы будут сканировать только одну ячейку. Я добавил это, чтобы объяснить вам, почему ваша попытка не сработала. - person msgambel; 24.04.2013
comment
я добавил ваш код .. когда я прокручиваю кнопку, несколько пролистываний происходят и в других разделах - person raptor; 25.04.2013
comment
Этого не может быть. Это точно сработает. Вы уверены, что правильно настраиваете табличное представление и ячейки? Вы можете легко проверить, что это дает правильный indexPath, создав фиктивное табличное представление и ячейки и проведя пальцем. Должна быть какая-то другая проблема. Скорее всего, проблема заключается в вашей многоразовой ячейке. Убедитесь, что при загрузке ячейки кнопка скрыта. Ваша модель данных вообще отслеживает это? - person msgambel; 25.04.2013
comment
.да ..я скрываю кнопку, когда я прокручиваю ее вправо ..когда я прокручиваю uitableview, тогда несколько ячеек в разных разделах прокручиваются...я отправлю вам проект по почте, я как бы поработал ..in cellForRowAtIndexPath if(cell == nil) { cell=[[PPsymptomTableCell alloc] initWithStyle:UITableViewCellStyleDefault **reuseIdentifier:nil**]; } ничего, если я сделаю это таким образом reuseIdentifier:nil – - person raptor; 25.04.2013
comment
Дайте мне знать, если у вас есть проект d / w.. если нет, я поставлю ссылку еще раз - person raptor; 26.04.2013
comment
@msgambel.. тебе удалось это понять? - person raptor; 27.04.2013
comment
У меня не было времени посмотреть на это. Я отвечу, как только сделаю это. - person msgambel; 27.04.2013
comment
привет.. ты смог выяснить, где была проблема? Спасибо - person raptor; 29.04.2013
comment
Можешь сделать репост проекта. Вы, кажется, удалили ссылку. - person msgambel; 29.04.2013
comment
как насчет сейчас ??... PPSymtomTableCell - моя пользовательская ячейка - person raptor; 29.04.2013
comment
Понятно. Позже посмотрю репост. - person msgambel; 29.04.2013
comment
2 вещи: 1. UISwipeGestureRecognizers должен быть в вашем PPViewController, как я описал выше. 2. Вы не сохраняете данные, если remedyLabel виден или нет. Есть 2 способа сделать это; либо создайте метод с именем reset в PPtableCell, который перемещает remedyLabel обратно в исходное место, и вызовите reset после cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];. Или вы можете сохранить значение BOOL в своем searchSymptomsArray, которое отмечает, показывает ли ячейка remedyLabel или нет, и перемещать его после того, как вы dequeue ячейку. - person msgambel; 29.04.2013
comment
Это нормально. Та же логика применима и к кнопке. - person msgambel; 29.04.2013
comment
.. remedyLabel находится в другом табличном представлении. - person raptor; 29.04.2013
comment
Мои комментарии объясняют, как это исправить. Замените remedyLabel на вашу красную кнопку, и все будет работать точно так же. Комментарий решит вашу проблему. - person msgambel; 29.04.2013
comment
.. спасибо, это сработало :) я создал метод сброса в customtableviewcell и вызвал этот метод в cellForRowAtIndexPath после dequeueReusableCell cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; [cell reset]; if (cell==nil) { } - person raptor; 29.04.2013
comment
еще одна вещь ... когда вы нажимаете на любую из первых ячеек таблицы. Вы увидите другую ячейку таблицы. этот переключатель включен для этой ячейки.. я сохраняю состояние переключателя в массиве с именем selectedSymptIPArray в cellForRowAtIndexPath.. изображение отображается неправильно, например, если я прокручиваю изображение, оно исчезает, а в других разделах изображения не отображаются (если uiswitch включен ) - person raptor; 29.04.2013
comment
selectedSymptIPArray хранит ненужные значения. Я знаю, что это основано на другом вопросе. Поскольку у вас есть проект, можете ли вы сообщить мне, где я ошибаюсь. - person raptor; 29.04.2013
comment
Вам придется позаботиться об этом в методе reset. Что происходит, когда вызывается cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];, он берет ячейку, которая находится в памяти. Если эта ячейка уже имеет переключатель, он останется таким, пока вы не скажете ей сделать что-то иное. Я бы предложил поиграть с методом reset или создать другой метод, который вы вызываете после reset, чтобы решить проблему, но по сути это та же идея. Однако с этого момента вы должны публиковать новые вопросы, так как это не тот способ, которым должен работать stackoverflow. - person msgambel; 29.04.2013
comment
хорошо .... проблема, с которой я сталкиваюсь, selectedSymptIPArray хранит ненужные значения - person raptor; 29.04.2013

Вы реализуете свою таблицу с помощью sections, затем сделайте значение тега комбинацией indexPath.sections и indexPath.row.

Но убедитесь, что вы реализуете без перекрытия tagValue.

person Rajneesh071    schedule 22.04.2013