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