ios - UITableViewCell : dequeueReusableCellWithIdentifier: Change button background per cell on a certain action

标签 ios objective-c uitableview

我有渲染单元格的表格 View 。我创建了一次单元格并重新使用它。在每个单元格中都有一个按钮,用于对某个地方进行投票操作。在投票操作中,我想更改按钮的背景图像。当我点击某个单元格中的按钮时,背景图像发生变化,但是当我向下滚动时,我发现另一个按钮的背景图像发生了变化。我认为问题是因为我正在使用 dequeueReusableCellWithIdentifier 但我找不到解决此问题的方法。

这是我的代码:

// .h file

@interface VotePlaceView : UIView < UITableViewDataSource, UITableViewDelegate>
{
    VotePlaceView *votePlaceCell;

}

在实现文件中

// .m File
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"votePlaceCell"];

    if (cell)
    {
        votePlaceCell = (VotePlaceView*)[cell viewWithTag:10];
    }

    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"votePlaceCell"];

        //GlobalObjects is a customised thing for me to load the cell in different languages 
        votePlaceCell = [[GlobalObjects loadNibNamed:@"votePlaceCell" owner:self options:nil] objectAtIndex:0];

        votePlaceCell.tag = 10;
        [cell addSubview:votePlaceCell];

    }


        .
        . //Fill data in the cell 
        .

    //This gives different IDs, no ID like the others (unique ID)
    NSLog(@"ID %d", [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue]);

    UIButton* voteButton = (UIButton*)[votePlaceCell viewWithTag:20];

    voteButton.tag = [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue];

    return cell;
}

-(IBAction)votePlace:(UIButton *)sender
{
     // I tried two ways to achieve my point with no luck 
    //Selected case give the new background image

    //THE FIRST WAY 
    sender.selected = YES;

    //OR THE SECOND WAY
    UIButton* newVotePlace;
    newVotePlace = (UIButton*)[[sender superview] viewWithTag:sender.tag];
    newVotePlace.selected = YES;
}

有什么想法吗?

解决方案

@Akhilrajtr 的回答解决了我的问题,我对他的回答做了一些修改。这是解决方案,以防万一有人遇到同样的问题。

我没有使用 UIButton,而是使用了 UIButton 和 UIImageView。我将 UIImageView 放在 UIButton 后面,并在默认情况下和突出显示情况下为 UIImageView 提供两个图像。我清除了 UIButton 的背景图像,然后按照接受的答案进行操作,如下所示:

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

      .
      .

    int placeId = [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue];

    UIButton* voteButton = (UIButton*)[votePlaceCell viewWithTag:20];
    if (!voteButton) {
        voteButton = (UIButton*)[votePlaceCell viewWithTag:placeId];
    }
    voteButton.tag = [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue];
    if ([selectedIdArray containsObject:[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"]]) {

        UIImageView* voteImage;
        voteImage = (UIImageView*)[votePlaceCell viewWithTag:11];
        voteImage.highlighted = YES;
    } else {
        UIImageView* voteImage;
        voteImage = (UIImageView*)[votePlaceCell viewWithTag:11];
        voteImage.highlighted = NO;
        voteButton.selected = NO;
    }

    return cell;

}

-(IBAction)votePlace:(UIButton *)sender
{

    [selectedIdArray addObject:[NSNumber numberWithInt:sender.tag]];

    UIImageView* voteImage;
    voteImage = (UIImageView*)[[sender superview] viewWithTag:11];
    voteImage.highlighted = YES;
}

最佳答案

试试这个,

创建一个 NSMutableArray *selectedIdArray(不要忘记在 viewDidLoad: 中实例化 selectedIdArray)来存储选定的 ID,并在 cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     .
     .
     //Other codes
     .
     .

     NSLog(@"ID %d", [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue]);
     int placeId = [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue];
     UIButton* voteButton = (UIButton*)[votePlaceCell viewWithTag:20];
     if (!voteButton) {
          voteButton = (UIButton*)[votePlaceCell viewWithTag:placeId];
     }
     voteButton.tag = [[[self.votePlacesResults objectAtIndex:indexPath.row] valueForKey:@"id"] intValue];
     if ([selectedIdArray containsObject:[NSNumber numberWithInt:placeId]) {
          voteButton.selected = YES;
     } else {
          voteButton.selected = NO;
     }
     return cell;
}

-(IBAction)votePlace:(UIButton *)sender
{
     [selectedIdArray addObject:[NSNumber numberWithInt:sender.tag]];
     sender.selected = YES;
}

关于ios - UITableViewCell : dequeueReusableCellWithIdentifier: Change button background per cell on a certain action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302435/

相关文章:

javascript - 我应该用哪种方法注入(inject)javascript? (stringByEvaluatingJavaScriptFromString)

iphone - UITableView 中每行多个单元格

iphone - IB、UITableView 分组样式设置不生效

ios - 如何过滤 UITableView 中的所有部分以获取想要的项目

ios - 我如何摆脱这个 Sigabrt 错误?我尝试了多种方法

android - 使用 flexbox 的网站无法在 IOS 上运行

ios - 构建分离到库和应用程序部分的应用程序时,框架 undefined symbol

ios - 绘制矩形导致错误,无法引用 myview

ios - UIScrollView 进入无限递归

ios - TableView 行上的开关更改会影响其他行