我正在尝试在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];
}
答案 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)
尝试一切后失败了。我最终在每一行中都有一个隐藏值,当按下按钮时它会改变。所以代码读取值然后配置每行的按钮。