我想在tableview中创建一个简单的复选框。首先,我在故事板中创建View,每个元素在单元格中都有一个标记。然后我在Controller.m中编写了这个
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
UIButton *checkbox = (UIButton *)[cell viewWithTag:103];
checkbox.selected = NO;
[checkbox setBackgroundImage:[UIImage imageNamed:@"uCheckbox2px"] forState:UIControlStateNormal];
[checkbox addTarget:self action:@selector(changeState:) forControlEvents:UIControlEventTouchUpInside];
...
}
-(void) changeState:(UIButton *)checkbox
{
checkbox.selected = !checkbox.selected;
if (checkbox.selected)
[checkbox setBackgroundImage:[UIImage imageNamed:@"cCheckbox2px"] forState:UIControlStateSelected];
else
[checkbox setBackgroundImage:[UIImage imageNamed:@"uCheckbox2px"] forState:UIControlStateNormal];
}
但如果点击按钮,图像就不会改变。这是为什么以及我如何解决它? 谢谢你的帮助!
答案 0 :(得分:1)
这是因为每次调用 cellForRowAtIndexPath: checkbox.selected = NO;
都会使所选属性 FALSE 。所以在那之后,在 changeState:,
checkbox.selected = !checkbox.selected;
会将所选属性更改为 TRUE 。因此,只要您点按该按钮,所选属性就会变为 TRUE 。因此,将 checkbox.selected = NO; 移至if(cell == nil)
条件
答案 1 :(得分:1)
像这样做
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
UIButton *checkbox = (UIButton *)[cell viewWithTag:103];
[checkbox setBackgroundImage:[UIImage imageNamed:@"uCheckbox2px"] forState:UIControlStateNormal];
[checkbox setBackgroundImage:[UIImage imageNamed:@"cCheckbox2px"] forState:UIControlStateSelected];
[checkbox addTarget:self action:@selector(changeState:) forControlEvents:UIControlEventTouchUpInside];
...
}
-(void) changeState:(UIButton *)checkbox
{
checkbox.selected = !checkbox.selected;
}
答案 2 :(得分:0)
我猜您不需要在按钮点击事件中给出的代码。只改变状态就足够了。
if (checkbox.selected)
[checkbox setBackgroundImage:[UIImage imageNamed:@"cCheckbox2px"] forState:UIControlStateSelected];
else
[checkbox setBackgroundImage:[UIImage imageNamed:@"uCheckbox2px"] forState:UIControlStateNormal];
但您需要在UIControlStateSelected
中指定两种状态(UIControlStateNormal
和cellForRowAtIndexPath
)的图像。