bdv
bdv

Reputation: 1204

Change values of UITableViewCell on tap

I need to change the value inside a UITableViewCell when the user taps on it.

I need to modify the value trough an animation of a value inside a UITableViewCell.

Right now, I've implemented a UITapGestureRecognizer when the user taps on the UILabel, like so:

UITapGestureRecognizer *tapOnAmount = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnBalance)];
[cell.amountLabel setUserInteractionEnabled:YES];
[cell.amountLabel addGestureRecognizer:tapOnAmount];

Changing the values in a method didTapOnBalance will crash the app, like so:

-(void)tapOnBalance{
    NSString *headerIdentifier = @"HeaderCell";
    HeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:headerIdentifier];
    cell.amountLabel.text = @"new Value"; // this will crash because at runtime
    // the compiler won't recognize cell.amountLabel...
}

Implementing this in the UITableViewCell will cause me to send the values of the HeaderTableViewCell to the subclass and I don't know how to do that either.

Upvotes: 0

Views: 153

Answers (3)

SefTarbell
SefTarbell

Reputation: 342

You can't just deque a new cell, that will not give you the cell that the user tapped - it will make a new one. But, if you change your tap handler just a little, you can get the index path of the cell tapped from the gesture.

You need a slight change to the initialization of the gesture (look at the selector):

UITapGestureRecognizer *tapOnAmount = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnBalance:)];
[cell.amountLabel setUserInteractionEnabled:YES];
[cell.amountLabel addGestureRecognizer:tapOnAmount];

and then another slight change to your handler:

- (void)tapOnBalance:(UITapGestureRecognizer *)sender
{
    CGPoint location = [sender locationInView:self.view];
    CGPoint locationInTableview = [self.tableView convertPoint:location fromView:self.view];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationInTableview];

    // then you can either use the index path to call something like configureCell or send a didSelectRowAtIndexPath like this:
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
}

Upvotes: 2

Duncan C
Duncan C

Reputation: 131398

Your code is totally wrong.

You're creating a new cell when the user taps on an existing cell, and trying to change the value displayed in that new cell. Don't do that.

Instead, change the data in your table view's data model, then tell your table view to reload that cell (as explained in ZAZ's answer.) If you've changed the data model to reflect new info for your cell, reloading it will cause it to be displayed with the new settings.

Upvotes: 1

ZAZ
ZAZ

Reputation: 593

you must implement didSelecRowAtIndexPath and write in it the following line of code after the changing the value to animate the tapped row

[self.myTableView reloadRowsAtIndexPaths:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

Hope it helps!

Upvotes: 0

Related Questions