我正在尝试实现用于在单击该行时更改行的按钮图像源的代码。这是一个清单表视图。表视图分为几个部分。不确定我做错了什么:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//change tickBtn's image src to tick.png
print("in didselect")
if let cell = tableView.cellForRowAtIndexPath(indexPath) as? CheckListCell {
let tickedImg = UIImage(named: "tick.png")
cell.tickBtn.setImage(tickedImg, forState: UIControlState.Selected)
//cell.tickBtn.alpha = 0
}
else{
print("in the else of didSelect")
}
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
//change tickBtn's image src to unTicked.png
print("in didDeselect")
if let cell = tableView.cellForRowAtIndexPath(indexPath) as? CheckListCell{
let tickedImg = UIImage(named: "unTicked.png")
cell.tickBtn.setImage(tickedImg, forState: UIControlState.Selected)
//cell.tickBtn.alpha = 1
}
else{
print("in the else of didDeSelect")
}
}
我正在获取didSelect和didDeSelect的日志,但图像源没有变化。必须与我如何访问单元格有关,我需要考虑该部分?
更新
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//change tickBtn's image src to tick.png
let cell = tableView.cellForRowAtIndexPath(indexPath) as? CheckListCell
cell!.cellTickedImage = UIImage(named: "tick.png")
self.checkListTableView.beginUpdates()
self.checkListTableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.checkListTableView.endUpdates()
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath) as? CheckListCell
cell!.cellTickedImage = UIImage(named: "unTicked.png")
self.checkListTableView.beginUpdates()
self.checkListTableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.checkListTableView.endUpdates()
}
class CheckListCell : UITableViewCell {
@IBOutlet weak var tickBtn: UIButton!
@IBOutlet weak var taskLbl: UILabel!
var cellTickedImage : UIImage?
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = checkListTableView.dequeueReusableCellWithIdentifier("CheckListCell", forIndexPath: indexPath) as! CheckListCell
cell.taskLbl?.text = checkListData[indexPath.section][indexPath.row]
cell.tickBtn.setImage(cell.cellTickedImage, forState: UIControlState.Normal)
cell.tickBtn.setImage(cell.cellTickedImage, forState: UIControlState.Highlighted)
//cell.tickBtn.titleLabel!.text = ""
return cell
}
答案 0 :(得分:4)
试试这个:
第1步:在didSelectRowAtIndexPath
更新驱动单元格图像的模型:
self.cellTickedImage = UIImage(named: "tick.png”)
第2步:在didSelectRowAtIndexPath
重新加载单元格以查看更改:
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.endUpdates()
第3步:在didDeselectRowAtIndexPath
更新驱动单元格图像的模型:
self.cellTickedImage = UIImage(named: "unTicked.png”)
第4步:在didDeselectRowAtIndexPath
重新加载单元格以查看更改:
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.endUpdates()
第5步:在cellForRowAtIndexPath
中正确设置单元格图像:
cell.tickBtn.setImage(self.cellTickedImage, forState: UIControlState.Normal)
cell.tickBtn.setImage(self.cellTickedImage, forState: UIControlState.Highlighted)
编辑:在OP上与OP进行讨论 - 讨论中的一些假设
考虑到这一点,这里是修复的高级算法:
checkListDict
,其中键为单元格文本,值为图像状态标志。对于所有单元格文本,最初设置值为0。将1视为tick.png
,将0视为unTicked.png
。didSelectRowAtIndexPath
中更新标志:- >
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//change tickBtn's image src to tick.png
let cell = tableView.cellForRowAtIndexPath(indexPath) as? CheckListCell
let selectedCellText = (cell!.taskLbl?.text)!
if checkListDict[selectedCellText] == 0 {
checkListDict[selectedCellText] = 1
}
else{
checkListDict[selectedCellText] = 0
}
self.checkListTableView.beginUpdates()
self.checkListTableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.checkListTableView.endUpdates()
}
cellForRowAtIndexPath
中的更新模型,如下所示:- >
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = checkListTableView.dequeueReusableCellWithIdentifier("CheckListCell", forIndexPath: indexPath) as! CheckListCell
let selectedCellText = checkListData[indexPath.section][indexPath.row]
cell.taskLbl?.text = selectedCellText
let cellImage = checkListDict[selectedCellText] == 0 ? UIImage(named: "unTicked.png") : UIImage(named:"tick.png")
cell.tickBtn.setImage(cellImage, forState: UIControlState.Normal)
cell.tickBtn.setImage(cellImage, forState: UIControlState.Highlighted)
return cell
}
答案 1 :(得分:0)
您是否尝试将图像设置为正常状态?
因为我可以从你给定的代码中推断出,你只是设置了所选的状态图像。 按钮始终处于正常状态。 因此,尝试将图像设置为正常状态。
答案 2 :(得分:0)
尝试:
第1步:make数组与你的行数有相同的元素。并在viewDidload中设置:
for (i = 0; i < NumberElement; i++) {
[self.listState addObject:@"0"];
}
第2步:在cellForRowAtIndexPath上检查它:
let tickedImg = UIImage(named: "unTicked.png")
cell.tickBtn.setImage(tickedImg, forState: UIControlState.Selected
let untickedImg = UIImage(named: "ticked.png")
cell.tickBtn.setImage(untickedImg, forState: UIControlstate.Normal)
if self.listState[indexPath.row) == 0 {
cell.tickBtn.selected = false
} else {
cell.tickBtn.selected = true
}
第3步:在didSelectRowAtIndexPath中:
if self.listState[indexPath.row] == "0" {
self.listState[indexPath.row] = "1"
} else {
self.listState[indexPath.row] = "0"
}
//Start reload cell
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.endUpdates()
希望这有帮助。 P / s:你可以做一些更好的方法。