分别从所有UITableViewCells获取数据

时间:2016-11-24 22:36:13

标签: ios swift uitableview tableview tableviewcell

我有一个返回四个单元格的TableViewController。每个单元格中都有三个按钮。细胞本身没有任何相互作用或连接,因为我不需要用户与细胞交互,只需要细胞中的三个按钮。

我有一个名为selections的空数组,如果按下每个按钮,我想将一个项目附加到该数组。到目前为止,我找不到任何方法来跟踪按下的每个按钮。

我可以将此代码放入哪种方法?

if cell.yes.isSelected == true {
            firstChoice = 1
            selections.append(firstChoice)
            print(selections.count, selections.reduce(0, +))
        }

这样它对我的TableViewController加载的所有单元格都有效吗?

3 个答案:

答案 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(),您可以按预期进行工作。