在UITableviewCell中更改按钮颜色

时间:2015-06-26 22:40:24

标签: ios objective-c uitableview tableviewcell

我正在尝试在tableviewCell中按下时更改按钮的颜色。但是,我的代码更改了表格中每个按钮的颜色,而不仅仅是我选择的单元格中的按钮的颜色,

如何更改我按下的按钮的颜色。

请参阅下面的代码,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];
    [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Test";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];/
    [addNotesButton addTarget:self action:@selector(addNotes :) forControlEvents:UIControlEventTouchUpInside];
}

3 个答案:

答案 0 :(得分:2)

主要问题可能出在您的cellForRowAtIndexPath:方法中。 UITableView个单元格会在屏幕上显示时重复使用。 dequeueReusableCellWithIdentifier:方法返回一个单元格(如果已标记为可以重复使用)。你必须看到在cellForRowAtIndexPath:方法中使用这种UITableView方法。 (见link

因此在cellForRowAtIndexPath:中,您必须在加载时配置每个单元格,否则它将显示旧值(因为单元格正在被重用)。

您可以声明属性或类型NSIndexPath的简单变量。让变量称为_selectedIndexPath。然后在didSelectRowAtIndexPath:中,您可以将此属性分配给所选的indexPath。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSArray *indexPaths = nil;
    if (_selectedIndexPath) {
        indexPaths = @[_selectedIndexPath, indexPath];
    } else {
        indexPaths = @[indexPath];

    }
    _selectedIndexPath = indexPath;
    [tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

- (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Your Cell Identifier"];
    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];

    if (indexPath.row == _selectedIndexPath.row) {
        [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    } else {
        [addNotesButton setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
    }
}

答案 1 :(得分:1)

您不需要在索引路径的选择行中手动更改颜色。只需设置UIControlStateSelected的颜色,然后在按钮的操作上点击按钮selected属性为YES。从你的代码我认为这应该有用。

索引路径方法

中行的单元格内部
 [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];

和按钮操作方法

-(IBAction)addNotes:(id)sender
{
    UIButton *button = (UIButton*)sender;
    buttons.selected = !button.isSelected;
}

我认为这会奏效。

答案 2 :(得分:0)

尝试一切后失败了。我最终在每一行中都有一个隐藏值,当按下按钮时它会改变。所以代码读取值然后配置每行的按钮。