Akhil K C
Akhil K C

Reputation: 4553

UITableViewCells with UIButton overlaps while scrolling

I need to create a table view with some buttons as its elements, view gets loaded fine, but while scrolling down buttons gets overlapped. I think old buttons are not cleared and new buttons are placing over it. Please help me to fix this problem. Thanks in advance.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath           (NSIndexPath *)indexPath
{
NSLog(@"index path %ld",(long)indexPath.row);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}


    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:[NSString stringWithFormat:@"data %ld",(long)indexPath.row] forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, 160.0, 25);
    [cell.contentView addSubview:button];


return cell;
}

Upvotes: 1

Views: 1294

Answers (6)

Sviatoslav Yakymiv
Sviatoslav Yakymiv

Reputation: 7935

I'd suggest using tags for this. See the code below.

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

    NSLog(@"index path %ld",(long)indexPath.row);
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

    NSInteger buttonTag = 100500;
    UIButton *button = [cell.contentView viewWithTag: buttonTag]
    if(button == nil)
    {
        button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.frame = CGRectMake(0, 0, 160.0, 25);
        [cell.contentView addSubview:button];
    }
    [button setTitle:[NSString stringWithFormat:@"data %ld",(long)indexPath.row] forState:UIControlStateNormal];

    return cell;

}

Upvotes: 1

Tuan Pham
Tuan Pham

Reputation: 631

If you use Xib you can use

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

if (cell==nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Cell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

Upvotes: 1

Bhavesh Nayi
Bhavesh Nayi

Reputation: 3656

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"index path %ld",(long)indexPath.row);

    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell = nil;
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];



        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button setTitle:[NSString stringWithFormat:@"data %ld",(long)indexPath.row] forState:UIControlStateNormal];
        button.frame = CGRectMake(0, 0, 160.0, 25);
        [cell.contentView addSubview:button];
    }

    return cell;
}

Upvotes: 1

Harish Suthar
Harish Suthar

Reputation: 711

Please insert below code just before you add button as subview, it will remove all the buttons in your content view of cell before you add a new one.

for(UIView *view in cell.contentView.subviews){
    if ([view isKindOfClass:[UIButton class]]) {
        [view removeFromSuperview];
    }
}

Upvotes: 0

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath           (NSIndexPath *)indexPath
{
NSLog(@"index path %ld",(long)indexPath.row);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

//if(cell == nil)
//{
  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
 //}


UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:[NSString stringWithFormat:@"data %ld",(long)indexPath.row] forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, 160.0, 25);
[cell.contentView addSubview:button];


return cell;
}

Upvotes: 1

Anbu.Karthik
Anbu.Karthik

Reputation: 82759

just replace the line

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]

is now

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

  (or) //use this in cell for rowatindexpath

for(UIView *view in cell.contentView.subviews){
    if ([view isKindOfClass:[UIView class]]) {
        [view removeFromSuperview];
    }
}

Upvotes: 3

Related Questions