首页 > 解决方案 > UITableView 自定义单元格按钮从主视图中选择其他按钮?

问题描述

在我的自定义 tableviewcell 上,我有一个按钮,用户可以按下该按钮在选定和未选定之间切换。这只是一个简单的 UIButton,这个按钮包含在我的 customtableviewcell 中作为插座。

import UIKit

class CustomCellAssessment: UITableViewCell {

@IBOutlet weak var name: UILabel!
@IBOutlet weak var dateTaken: UILabel!
@IBOutlet weak var id: UILabel!
@IBOutlet weak var score: UILabel!
@IBOutlet weak var button: UIButton!


override func awakeFromNib() {
     super.awakeFromNib()
    // Initialization code
}

 override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)


    // Configure the view for the selected state
}

@IBAction func selectButton(_ sender: UIButton) {

if sender.isSelected{

  sender.isSelected = false

}else{
  sender.isSelected = true
} 
} 
}

奇怪的是,当我按下第一个单元格上的按钮时,它会在同一个表格视图中的另一个单元格(视图之外)上选择一个按钮 8 个单元格。每个单元格都有自己的按钮,但好像使用 dequeReusableCell 会导致系统以这种方式运行。为什么要这样做,这与 UIbuttons 在 tableviewcells 上的工作方式有关吗?

谢谢

标签: iosswiftuitableviewuibuttontableview

解决方案


每个单元格都有自己的按钮,但好像使用 dequeReusableCell 会导致系统以这种方式运行。

错误的。UITableViewCells 是可重用的,所以如果你的 tableView 有 8 个可见的单元格,当加载第 9 个时,单元格 nr 1 将被重用。

解决方案:您需要跟踪细胞的状态。调用该方法时cellForRowAtIndexPath,您需要从头开始配置单元格。

您可以在 ViewController 中有一个包含单元格状态的小数组:

var cellsState: [CellState]

并将每个 indexPath 的选定状态存储在那里。然后在 cellForRowAtIndexPath 中,为单元格配置状态。

cell.selected = self.cellsState[indexPath.row].selected

所以,我要做的概述是:

1 - 在cellForRowAtIndexPath, 我会设置

cell.button.tag = indexPath.row
cell.selected = cellsState[indexPath.row].selected

2 - 将 IBAction 移动到您的 ViewController 或 TableViewController

3 - 当点击方法被调用时,更新单元格的选中状态

self.cellsState[sender.tag].selected = true

请记住始终将整个单元格配置为cellForRowAtIndexPath

编辑:

import UIKit

struct CellState {
    var selected:Bool
    init(){
        selected = false
    }
}

class MyCell: UITableViewCell {

    @IBOutlet weak var button: UIButton!

    override func awakeFromNib() {
        self.button.setTitleColor(.red, for: .selected)
        self.button.setTitleColor(.black, for: .normal)
    }

}

class ViewController: UIViewController, UITableViewDataSource {

    var cellsState:[CellState] = []

    @IBOutlet weak var tableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()

        //Add state for 5 cells.
        for _ in 0...5 {
            self.cellsState.append(CellState())
        }
    }   


    @IBAction func didClick(_ sender: UIButton) {

        self.cellsState[sender.tag].selected = true
        self.tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cellsState.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MyCell
        cell.button.isSelected = self.cellsState[indexPath.row].selected
        cell.button.tag = indexPath.row
        return cell
    }
}

推荐阅读