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

问题描述:

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

Soo现在我已经为此写了代码,当我点击一个按钮后,那个按钮的背景颜色就不会改变,而是改变了其他行中改变背景颜色的同一个按钮。

使用案例: 1.我在UITableView中有10行,每个单元格包含4个按钮,分别命名为 “好”,“更好”,“最佳”,“最差”。

  1. 当我在第一行单击“Good”按钮时,预计它应该将颜色更改为红色。

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 ]; 



} 

请帮我清除这个问题

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]; 
+0

让我试试这个 – 2015-03-25 08:31:36

+0

工作很棒....非常感谢,我会upvote并接受这个答案 – 2015-03-25 08:34:01

+0

做了自定义单元解决方案的更新。也许对你更好 – geo 2015-03-25 08:37:42

你并不需要使用层的按钮,它足以设置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]; 
+0

我应该在哪里把这个代码?在按钮点击或cellfor行索引? – 2015-03-25 08:21:09

+0

在' - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath'。您将使用indexPath来检索单元格。 – 2015-03-25 08:26:42

+0

我没有选择row..pease阅读我的question.am只选择按钮.button有单独的行动 – 2015-03-25 08:30:34

我创建一个自定义的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]]; 
}