Search code examples
iphoneiosobjective-cuitableviewuiswipegesturerecognizer

How to swipe tableviewcell for particular row in a section


I have a custom UITableview which is diveded into sections, I have implemented UISwipeGestureRecognizer into it. When I swipe my table view cell, a UIButton appears. The problem I am now facing is when I swipe the first table view cell, another cell in successive sections also recognizes the swipe gesture. I am not able to find how to swipe a cell of particular a section without other cells of other sections getting swiped.

I just want to swipe, I don't want to delete/insert or add check marks.

UPDATE.... This is my 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;

}

In my 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];
              }
 }

Solution

  • Try:

    - (void)handleSwipe:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer; {
      CGPoint location = [aSwipeGestureRecognizer locationInView:_tableView];
      NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:location];
    
      if(indexPath){
        UITableViewCell * cell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:indexPath];
        [cell whateverMethodYouWant];
      }
    }
    

    As a side note, the reason you are getting calls to multiple cells is because the row is not unique enough. There is a row = 0 in all of you sections. Therefore, if you want each cell to have a unique number attached to its .tag property, you would need to know the largest number of rows in any section (call it largestNumberOfRows), and then compute:

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

    Hope that helps!

    EDIT:

    To use the above method, in your viewDidLoad; method, add the following code:

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

    EDIT 2

    Looking at your code, you have put your gesture recognizers in the wrong file. Here is the setup:

    In your MainViewController.m file:

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

    In your PPsymptomTableCell.m file:

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

    This should get everything working nicely.