表格视图单元格按钮,单击更改按钮图像

时间:2018-07-06 13:51:50

标签: ios swift uitableview uibutton

当前,我的项目有一个Table View Controller,每行都有一个按钮和文本。我在确定如何在单击按钮后如何更改特定行上的按钮图像时遇到问题。我已经具有功能“重写func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath)”,以将我的应用程序带到新视图。我需要按钮(单击时)将特定行上的数据添加到收藏夹变量。然后将其显示在其他屏幕上。我的按钮不会更改视图。

当前,我有一个按钮事件函数,每次单击一行中的按钮时都会调用该函数。我遇到的问题是我不知道如何访问被单击的行中的特定按钮,而仅更改该按钮的图像。

这是我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

    // Setting Text and images
    cell.batchName.text = processes[indexPath.item].batch_name
    cell.startTime.text = processes[indexPath.item].starttime
    cell.endTime.text = processes[indexPath.item].endtime
    cell.slaTime.text = processes[indexPath.item].SLA
    var statusColor = UIColor.black

    // Calling Button event function
    cell.starButton.addTarget(self, action: #selector(favoriteStarClicked), for: UIControlEvents.touchUpInside)

    return cell
}

@IBAction func favoriteStarClicked(_ sender: Any) {

    // Need to change the image of the button that was clicked 
}

1 个答案:

答案 0 :(得分:1)

现代的Swift方法是回调闭包

  • 在模型中为收藏夹状态添加一个属性

    var isFavorite = false
    
  • 在Interface Builder中,选择自定义单元中的按钮,然后按⌥⌘4进入“属性”检查器。在弹出菜单State Config中选择Selected,然后在star弹出窗口中选择Image图像(状态为Default的图像保留为空白)。

  • 在自定义单元格中,添加一个callback属性和一个按钮操作(将其连接到按钮)。通过按钮的isSelected属性设置图像

    var callback : (()->())?
    
    @IBAction func push(_ sender: UIButton) {
        callback?()
    }
    
  • cellForRow中根据isFavorite设置图片并添加回调

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    
        // Setting Text and images
        cell.batchName.text = processes[indexPath.item].batch_name
        cell.startTime.text = processes[indexPath.item].starttime
        cell.endTime.text = processes[indexPath.item].endtime
        cell.slaTime.text = processes[indexPath.item].SLA
        var statusColor = UIColor.black
        let item = processes[indexPath.row]
        cell.button.isSelected = item.isFavorite
        cell.callback = {
            item.isFavorite = !item.isFavorite
            cell.button.isSelected = item.isFavorite
        }
    
        return cell
    }
    

回调会更新单元格中的模型和图像


  • 无协议/委托。
  • 没有自定义目标/操作。
  • 没有标签。
  • 没有索引路径。
  • 没有单元格算术。