我有一个返回四个单元格的TableViewController。每个单元格中都有三个按钮。细胞本身没有任何相互作用或连接,因为我不需要用户与细胞交互,只需要细胞中的三个按钮。
我有一个名为selections
的空数组,如果按下每个按钮,我想将一个项目附加到该数组。到目前为止,我找不到任何方法来跟踪按下的每个按钮。
我可以将此代码放入哪种方法?
if cell.yes.isSelected == true {
firstChoice = 1
selections.append(firstChoice)
print(selections.count, selections.reduce(0, +))
}
这样它对我的TableViewController加载的所有单元格都有效吗?
答案 0 :(得分:1)
首先 - 您应该在ViewController中保留有关按下按钮的信息 - 而不是在表格单元格内。 表单元格将被重用 - 您将丢失该信息。 最好的方法是在单元格和TableViewController之间使用自定义委托。在创建每个单元格时,您可以:
cell.delegate = self
并且在按下按钮时在单元格内部,您可以调用此委托方法 - 让我们说didPressButton1
didPressButton2
。
此外,如果您希望在TableViewController中创建单元格时保持此状态为持久性(例如禁用,启用某个按钮),则需要提取现有数据并将其应用于单元格本身 - 同样重复使用TableViewCells。 / p>
答案 1 :(得分:1)
为了达到你想要的效果,你需要为自定义单元格和按钮创建委托。
//here is the view controller class
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, CustomCellDelegate {
var firstChoice = 0
var selections = Array<Any>()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as? CustomCell
cell?.delegate = self
return cell!
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
func cellButtonTapped(_ cell: CustomCell) {
if cell.isSelected {
firstChoice = 1
selections.append(firstChoice)
}
}
}
自定义单元格类
protocol CustomCellDelegate {
func cellButtonTapped(_ cell: CustomCell)
}
class CustomCell: UITableViewCell, CustomButtonDelegate {
var delegate: CustomCellDelegate?
@IBOutlet weak var button1: CustomButton!
@IBOutlet weak var button2: CustomButton!
@IBOutlet weak var button3: CustomButton!
override func awakeFromNib() {
super.awakeFromNib()
button1.delegate = self
button2.delegate = self
button3.delegate = self
}
func buttonTapped() {
self.isSelected = !self.isSelected
if let delegate = delegate {
delegate.cellButtonTapped(self)
}
}
}
自定义按钮
protocol CustomButtonDelegate{
func buttonTapped()
}
class CustomButton: UIButton {
var delegate: CustomButtonDelegate?
override func awakeFromNib() {
super.awakeFromNib()
self.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
}
func buttonTapped(_ sender: AnyObject) {
if let delegate = delegate {
delegate.buttonTapped()
}
}
}
他们都有他们的协议
答案 2 :(得分:0)
我不知道您的规格,但似乎您可以为每个按钮添加不同的目标:
button1?.addTarget(self, action:#selector(self.button1Clicked), forControlEvents: .TouchUpInside)
...
button3?.addTarget(self, action:#selector(self.button3Clicked), forControlEvents: .TouchUpInside)
然后你可以:
func button1Clicked() {
firstChoice = 1
selections.append(firstChoice)
}
...
func button3Clicked() {
firstChoice = 3
selections.append(firstChoice)
}
这样,如果单击按钮编号1,则会触发button1Clicked(),您可以按预期进行工作。