如何在UITableviewCell中点击更改UIButton的背景颜色?

时间:2015-03-25 08:07:14

标签: ios objective-c uitableview uibutton

我有UITableviewCell,我在单元格中放置了4个按钮。当我点击一个按钮时,我需要将其背景颜色更改为红色。

现在我已经为此编写了代码,当我点击一个按钮时,那个按钮背景颜色没有改变,而是改变了其他一行改变背景颜色的那个按钮。

用例: 1.我在UITableView中有10行,每个单元格包含4个名为的按钮   “良好”, “较好”, “最好”, “最差”。

  1. 当我点击第一行中的“好”按钮时,我希望它应该将颜色更改为红色。
  2. 3.现在如果我点击第一行中的“好”按钮然后在向下滚动时不改变颜色,但我可以看到第4和第8行中的“好”按钮变为红色。
    所以我的代码中有些错误会改变颜色。

    请检查我的tableview代码和按钮单击代码

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 4;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        int sectionCount;
        if(section==0)
        {
            sectionCount=4;
        }else if(section==1){
            sectionCount=4;
    
        }else if (section==2){
            sectionCount=3;
    
        }else if(section==3){
            sectionCount=1;
    
        }
        return sectionCount;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        sharedManager=[Mymanager sharedManager];
            static NSString *CellIdentifier = @"cell";
    
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[questioncell alloc] initWithStyle:UITableViewCellStyleValue1
                                           reuseIdentifier:CellIdentifier];
            }
    
            cell.excellentButton.tag=indexPath.row;
            cell.goodButotn.tag=indexPath.row;
            cell.fineButton.tag=indexPath.row;
            cell.dorrButton.tag=indexPath.row;
        if(indexPath.section==0){
            cell.question.text=[questions objectAtIndex:indexPath.row];
        } else if(indexPath.section==1){
            cell.question.text=[section1 objectAtIndex:indexPath.row];
    
        }else if(indexPath.section==2){
            cell.question.text=[section2 objectAtIndex:indexPath.row];
    
        }else if(indexPath.section==3){
            cell.question.text=[section3 objectAtIndex:indexPath.row];
    
        }
     return cell;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 200;
    }
    

    按钮点击代码

    - (IBAction)goodButton:(id)sender {
    
        UIButton *button = (UIButton *)sender; // first, cast the sender to UIButton
        NSInteger row = button.tag; // recover the row
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
        NSString *key=[NSString stringWithFormat:@"%ld",(long)indexPath.row];
        [sharedManager.ratingDic setValue:@"Good" forKey:key];
        cell.goodButotn.layer.backgroundColor=[[UIColor colorWithRed:39/255.0 green:174/255.0 blue:96/255.0 alpha:100] CGColor ];
    
        cell.betterButton.layer.backgroundColor=[[UIColor clearColor] CGColor ];
        cell.bestButton.layer.backgroundColor=[[UIColor clearColor] CGColor ];
        cell.worstButton.layer.backgroundColor=[[UIColor clearColor] CGColor ];
    
    
    
    }
    

    请帮我解决此问题

3 个答案:

答案 0 :(得分:2)

UIButton *button = (UIButton *)sender;< - 这已经是您对按钮的引用了。我看到有两种方法可以做到这一点

创建自定义UITableViewCell并实现重置所有颜色和设置正确颜色的方法。这是干净的方式。在这里,您可以实现更多逻辑并始终具有正确的相应数据。这里每个按钮都调用一个自己的方法,你也有一个明确的方法。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if( self = [super initWithStyle:style reuseIdentifier:reuseIdentifier] )
    {
        [excellentButton addTarget:self action:@selector(clickedExcellentButton) forControlEvents:UIControlEventTouchDown]; // or TouchUp, how ever you like
        [goodButton addTarget:self action:@selector(clickedGoodButton) forControlEvents:UIControlEventTouchDown];
        [fineButton addTarget:self action:@selector(clickedFineButton) forControlEvents:UIControlEventTouchDown];
        [dorrButton addTarget:self action:@selector(clickedWoButton) forControlEvents:UIControlEventTouchDown];
    }

    return self;
}

-(UIColor *)selectionColor
{
    return [UIColor colorWithRed:39/255.0 green:174/255.0 blue:96/255.0 alpha:100];
}

-(void)resetSelection
{
    excellentButton.backgroundColor = [UIColor clearColor];
    goodButton.backgroundColor = [UIColor clearColor];
    fineButton.backgroundColor = [UIColor clearColor];
    dorrButton.backgroundColor = [UIColor clearColor];
}

-(void)clickedExcellentButton
{
    [self resetSelection];
    excellentButton.backgroundColor = [self selectionColor];
    NSString *key=[NSString stringWithFormat:@"%ld",(long)indexPath.row];
    [sharedManager.ratingDic setValue:@"Excellent" forKey:key]; // if you have your sharedManager object here. If you cannot access it from here, you have to forward it or give the cell a reference to it
}

-(void)clickedGoodButton
{
    [self resetSelection];
    goodButton.backgroundColor = [self selectionColor];
    NSString *key=[NSString stringWithFormat:@"%ld",(long)indexPath.row];
    [sharedManager.ratingDic setValue:@"Good" forKey:key];
}

...

- (IBAction)goodButton:(id)sender {

UIButton *button = (UIButton *)sender; // this is the button that was clicked
// [...]
for(UIButton *ctrl in [button.superview subviews]) // button.superview get the view that holds him. Subviews all the others in his layer
{
    if([ctrl isKindOfClass:[UIButton class]])
    {
        ctrl.backgroundColor = [UIColor clearColor];
    }
}
button.backgroundColor = [UIColor colorWithRed:39/255.0 green:174/255.0 blue:96/255.0 alpha:100];

答案 1 :(得分:1)

我创建了一个自定义的tableview单元格,当按下按钮时,这四个按钮使用相同的IBAction。然后更改该按钮的背景颜色。它有效。

的TableView

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 2;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellID = @"cell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
    cell = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil][0];
}
return cell;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}

按钮点击代码

- (IBAction)actionButtonPressed:(UIButton *)sender {
[sender setBackgroundColor:[UIColor redColor]];
}

答案 2 :(得分:0)

你不需要使用按钮层来设置backgroundColor(我假设你可以通过cell.Button访问你的按钮)

cell.goodButton.backgroundColor = [[UIColor colorWithRed:39/255.0 green:174/255.0 blue:96/255.0 alpha:100] CGColor ];
...

cell.betterButton.backgroundColor = [UIColor clearColor];
cell. bestButton.backgroundColor = [UIColor clearColor];
cell. worstButton.backgroundColor = [UIColor clearColor];