在UITableView中滚动后,UIButton颜色会发生变化

时间:2014-06-19 18:38:27

标签: ios xcode uitableview

我有一个tableview,我在xib中设置它的单元格。我有一个按钮,当我点击它时,它会将按钮颜色从红色变为绿色。当我滚动tableview并返回绿色按钮时,它再次返回红色。这是我的代码:

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

    ProgramCell *cell = (ProgramCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProgramCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    [cell.btnHatirlat addTarget:self action:@selector(remind:)
                          forControlEvents:UIControlEventTouchUpInside];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    [cell.contentView setUserInteractionEnabled: NO]; 

    return cell;
}

- (void) remind:(UIButton *)sender {        
    UIButton *btnTemp = (UIButton *)sender;
    int iTag = btnTemp.tag;

    // I want to change image of sender
    [btnTemp setBackgroundColor:[UIColor greenColor]];

}

编辑:我已经添加了我的解决方案作为答案。我希望它会有所帮助。

3 个答案:

答案 0 :(得分:1)

我会这样做:

Tableview不知道在重用单元格时如何“记住”按钮状态。

我创建了一个NSMutableArray,它在按钮“开启”或“关闭”时保存BOOL(或任何其他)标志。如果你愿意,初始化那个带有全部“关闭”的数组,然后在点击“on”时相应地改变与indexPath.row相对应的索引处的值。 读取cellForRowAtIndexPath中的值并相应地更改颜色。

如果您有多个部分,请为每个部分创建一个数组,并让它为相应数量的单元格保存一个数组。

如果该DBView备份了该tableView,则为该状态添加一个标志(开/关),并保存它。在我的脑海中,我不知道这需要一个reloadData来让一切按预期工作。

答案 1 :(得分:1)

您需要存储按下按钮的单元格索引。

试试这个 - >

- (void)remind:(UIButton *)sender {        
    UIButton *btnTemp = (UIButton *)sender;
    self.iTag = btnTemp.tag;
    /*For many buttons
    [btnTemp setSelected:![btnTemp isSelected]];
    self.buttonStates[btnTemp.tag] = @([btnTemp isSelected);
    */

    // I want to change image of sender
    [btnTemp setBackgroundColor:[UIColor greenColor]];
}

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

    ProgramCell *cell = (ProgramCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProgramCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    if (self.iTag == indexPath.row) {
        [cell.btnHatirlat setBackgroundColor:[UIColor greenColor]];
    }
    /*For many buttons
    [cell.btnHatirlat setSelected:[self.buttonStates[indexPath.row] boolValue]];
    if ([cell.btnHatirlat isSelected]) {
        [cell.btnHatirlat setBackgroundColor:[UIColor greenColor]];
    }
    */

    [cell.btnHatirlat addTarget:self action:@selector(remind:)
                      forControlEvents:UIControlEventTouchUpInside];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    [cell.contentView setUserInteractionEnabled: NO]; 

    return cell;
}
祝你好运!

答案 2 :(得分:0)

这是我的解决方案,我想再次感谢@Bernard Grabowski和@MobiDevCom。我保存了点击按钮的部分和行号,并检查是否点击了它。

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"ProgramCell";

    ProgramCell *cell = (ProgramCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProgramCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    NSString* strTemp = [NSString stringWithFormat: @"%d/%d", indexPath.section, indexPath.row ];

    //To check clicked button at current section and row is clicked
    for (int i = 0; i < buttonClickedArray.count; i++) 
    {
        if([[self.buttonClickedArray objectAtIndex:i] isEqualToString:strTemp])
            [cell.btnHatirlat setBackgroundColor:[UIColor greenColor]];
    }


    NSString *str = [[etkinlikArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];


    [cell.btnHatirlat addTarget:self action:@selector(remind:)
               forControlEvents:UIControlEventTouchUpInside ];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    [cell.contentView setUserInteractionEnabled: NO]; 
    }

    return cell;
}

- (void) remind:(UIButton *)sender
{
    //to get clicked button's indexpath
    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *clickedButtonPath = [self.tableProgram indexPathForCell:clickedCell];
    self.currentIndexPathStr = [NSString stringWithFormat: @"%d/%d", clickedButtonPath.section, clickedButtonPath.row];

    [self.buttonClickedArray addObject:currentIndexPathStr];

    [btnTemp setBackgroundColor:[UIColor greenColor]];

}