单击更改行按钮图像源?

时间:2015-10-29 10:07:20

标签: ios swift uitableview sections

我正在尝试实现用于在单击该行时更改行的按钮图像源的代码。这是一个清单表视图。表视图分为几个部分。不确定我做错了什么:

 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
    }

3 个答案:

答案 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进行讨论 - 讨论中的一些假设

  1. 没有两个单元格上面有相同的文字。
  2. 在一个水龙头上显示一个图像,在第二个水龙头上显示第二个图像。
  3. 考虑到这一点,这里是修复的高级算法:

    1. 创建一个全局字典checkListDict,其中键为单元格文本,值为图像状态标志。对于所有单元格文本,最初设置值为0。将1视为tick.png,将0视为unTicked.png
    2. didSelectRowAtIndexPath中更新标志:
    3. - >

      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()
      }
      
      1. 最后,使用cellForRowAtIndexPath中的更新模型,如下所示:
      2. - >

        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:你可以做一些更好的方法。