mooco
mooco

Reputation: 51

UITableView Cell Button mixed up

I have a problem, setting a button to a UITableviewCell.
After viewDidLoad, the button is on the right place. But when I am scrolling down, the button is anyplace else.

Here is my code, I hope you can help me.
Thanks In Advance.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

if (indexPath.section == 0 && indexPath.row == 0 && _isAddImageViewLoad == NO) {
    // Add Image Button
    UIButton *addImage = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage* image = [UIImage imageNamed:@"AddImage@2x"];
    addImage.frame = CGRectMake(110.0f, 10.0f, 110.0f, 110.0f);
    [addImage setImage:image forState:UIControlStateNormal];

    [cell.contentView addSubview:addImage];
    _isAddImageViewLoad = YES;
} else {
    NSDictionary *dictionary = [_items objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"data"];
    NSString *cellValue = [array objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;
}

return cell;

}

Upvotes: 1

Views: 226

Answers (5)

Ashish Agarwal
Ashish Agarwal

Reputation: 14925

Look at this line of code:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

This line of code means the UITableViewCells are not created every time. They are re-used as you scroll up and down. Using the code you have above, the UIButton will be created in the correct spot, but then as the cells are re-used, it will create the button in random spots.

One quick way to solve the problem, change the above line of code to simply

UITableViewCell *cell;

Upvotes: 0

John
John

Reputation: 2660

The problem is because of the dequeue for the cells. The first time the tableview creates the cells, all the cells run through the

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

code. But when the section 0 row 0 is moved off the screen, that cell is pushed into the cell reusable queue.

Now when your tableview needs to display section 0 row 0, it will get a cell from the reuse queue. you will not get the same cell as the first time. So now you might have 2 cells with the button.

What you should do is have different CellIdentifier for section 0 row 0 , and all other sections and rows. Also create the button when creating the cell. So after the first time the tableView creates the cell, you will not be creating the the button everything.

Upvotes: 0

rdelmar
rdelmar

Reputation: 104082

The problem is because of cell reuse. You need to put some code in the else clause to delete the button if it exits. One way to do this, would be to give your button a tag, like:

addImage.tag = 10;

Then in your else clause:

}else{
    if (cell viewWithTag:10) [[cell viewWithTag: 10] removeFromSuperview];
    ...

Upvotes: 0

Kibitz503
Kibitz503

Reputation: 867

Just a couple things. If you use "AddImage" it will use the "AddImage@2x" automatically if it's a retina display. I don't think that will solve your issue but it could be causing weirdness.

When a table view cell is scrolled off the view it is "recycled" in a sense. It appears like you are using a bool to exclude the original cell from being loaded again with a button. You may want to use a header to hold your button if you always want it at the "top". You may also want to verify that the button is being removed when the cell is reused. if its not it will show up in the next row that reuses that cell.

On a side note... Buttons don't usually work very well in table view cells because they handle touches in very different ways. It's quite a bit of modification to get them to feel natural but that's another matter.

Hope that helps!

Upvotes: 0

JeffN
JeffN

Reputation: 1605

It is because you are reusing the cells, and the button is getting placed when it shouldn't an easy solution in your else section. Write addImage.hidden = YES; and in your if statement put addImage.hidden = NO;

Upvotes: 1

Related Questions