Master Stroke
Master Stroke

Reputation: 5128

Insert row in UiTableView does not update rest cell’s indexPath?

Say i’m loading UITableview with each UITextView inside each cell as subview.And i’ve assigned indexPath.row as tags for each textview.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"userDetails";
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    UITextView *textView=[[UITextView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, 60)];
    NSString * myString = [contentArray1 objectAtIndex:indexPath.row];
    textView.text= myString;

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
    [tapRecognizer setNumberOfTouchesRequired:1];
    [tapRecognizer setDelegate:self];
    textView.userInteractionEnabled = YES;
    textView.tag = indexPath.row;//assign tags to textview
    [textView addGestureRecognizer:tapRecognizer];
    [cell addSubview:textView];

    return cell;
}

Below method gets called once the user taps on any textview.I’m seeing proper tag values printed when i tap on any textviews.

-(void) action:(id)sender
{
    //NSLog(@"TESTING TAP");
    UITapGestureRecognizer *tapRecognizer = (UITapGestureRecognizer *)sender;

    NSLog (@"%d",[tapRecognizer.view tag]);
}

Now i would like to insert row in my tableview,say at index 3.

What i did is simple,

[contentArray1 insertObject:[NSString stringWithFormat:@"added cell”] atIndex:3];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:3 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

Now when i try to tap on any textviews after the inserted cell,i’m able to see the old tag values.Meaning,after row gets inserted to tableview at index=3,when i tap on textview i can see tag=2,then again when i tap on next cell’s textview i can see tag=2,it should be 3.

My question is,once we insert any row/cell in tableview,the tableview will not refresh other cell tags/index?….

I can fix it by calling reloadVisibleCells method.But i’m looking out for better solution.I don’t want to refresh whole screen just for inserting a row.Any solutions would be greatly appreciated.

Upvotes: 0

Views: 580

Answers (2)

Costique
Costique

Reputation: 23722

Your problem is that inserting/deleting rows doesn't cause reloading of other rows, and this is the expected and correct behavior. However, since -tableView:cellForRowAtIndexPath: is not called for those other rows, they are still configured with old (now obsolete) tags.

You can fix it in a number of ways (off the top of my head):

  • subclass UITableViewCell and store the represented object itself as its property (instead of the object's index)
  • associate the object with the UITableViewCell with objc_setAssociatedObject()
  • use -[UITableView indexPathForCell:] instead of tags to figure out a cell's real index path.

Upvotes: 1

quarezz
quarezz

Reputation: 454

Try to do it like this:

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

Upvotes: 1

Related Questions