IOS: Maintaining button state in uitableviewcell

前端 未结 3 808
天涯浪人
天涯浪人 2021-01-14 09:28

I have an iPhone app problem that\'s been bugging me for a few days and it really doesn\'t seem like it should be this difficult so I\'m sure I\'m missing something obvious.

相关标签:
3条回答
  • 2021-01-14 10:07

    there is a simple way out of this. you can trick the button to keep being in the latest selected state.

    make a mutable array, for the purpose of keeping the selected state of the button

    selectedButton = [[NSMutableArray alloc]init];//i've already defined the array at the .h file
    
    for (int i = 0; i<yourTableSize; i++) //yourTableSize = how many rows u got
    {
        [selectedButton addObject:@"NO"];
    }
    

    at the tableviewcell method, declare your button and set it so that it refers to the mutablearray to set it's selected state

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) 
    { 
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    }
    
    UIImage *img = [UIImage imageNamed:@"btn_unselected.png"];
    UIButton *toggleButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, img.size.width, img.size.height)];
    [toggleButton setImage:img forState:UIControlStateNormal];
    img = [UIImage imageNamed:@"btn_selected.png"];
    [toggleButton setImage:img forState:UIControlStateSelected];
    [toggleButton setTag:indexPath.row+100];//set the tag whichever way you wanted it, i set it this way so that the button will have tags that is corresponding with the table's indexpath.row
    [toggleButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:toggleButton];
    
    //and now we set the button's selected state, everytime the table reuse/redraw the cell the button will set it's selected state according to the array
    
    if([[selectedButton objectAtIndex:indexPath.row]isEqualToString:@"NO"])
    {
        [toggleButton setSelected:NO];
    }
    else 
    {
        [toggleButton setSelected:YES];
    }
    
    return cell;
    

    and finally, create the method which the button triggered when the button is pressed, to change it's selected state

    -(void)buttonPressed:(UIButton*)sender
    {
        int x = sender.tag - 100; //get the table's row
        if([sender isSelected]) //if the button is selected, deselect it, and then replace the "YES" in the array with "NO"
        {
            [selectedButton replaceObjectAtIndex:x withObject:@"NO"];
            [sender setSelected:NO];
        }
        else if (![sender isSelected]) //if the button is unselected, select it, and then replace the "NO" in the array with "YES"
        {
            [selectedButton replaceObjectAtIndex:x withObject:@"YES"];
            [sender setSelected:YES];
        }
    }
    
    0 讨论(0)
  • 2021-01-14 10:12

    This is not valid (At least not if you are trying to compare strings my contents instead of addresses):

    if (myRating == @"9")
    

    Try this:

    if ([myRating isEqualToString:@"9"])
    

    And +1 to yuji for noticing the multiple button creation.

    0 讨论(0)
  • 2021-01-14 10:26

    The problem is that every time you create or reuse a cell you're giving it a new like button, so when you reuse a cell where the like button has been activated, you're giving it a deactivated like button but the old, activated like button is still there as well.

    Instead of creating a like button every time you need a cell, you should just be setting the state of an existing like button. See the answers to this question for some possible ways of handling that.

    0 讨论(0)
提交回复
热议问题