如何在自定义表格视图单元格中创建自定义视图?

时间:2018-10-24 14:12:02

标签: swift xcode uitableview

我正在尝试在自定义表格视图单元格内创建一个自定义复选框。

我有一个自定义表格视图单元格:

class CustomTableViewCell: UITableViewCell {
   weak var delegate: CellDelegateT?
   @IBOutlet var customCheckbox: VKCheckbox!
}

以下是加载我的tableView的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TransactionsTableViewCell
    let customCheckbox = cell.customCheckbox!
    customCheckbox.line = .thin
    customCheckbox.bgColor = UIColor.white
    customCheckbox.color = UIColor.black
    customCheckbox.borderColor = UIColor.black
    customCheckbox.borderWidth = 2
    customCheckbox.cornerRadius = customCheckbox.frame.height / 2
}

我需要在哪里放置构成复选框的代码? cellForRowAt是不正确的地方吗?

当我在表格单元格之外使用代码时,它可以正常工作。这就是为什么我认为我将复选框创建代码放置在错误的位置。

2 个答案:

答案 0 :(得分:1)

您的问题答案是“是的,您应该将复选框设置放到另一个位置。特别是我建议您将其移至CustomTableViewCell类”

有一种观点认为,良好的面向对象软件设计基于SOLID原则。

SOLID 是首字母缩写。 S 代表Single responsibility principle.。简而言之-一个类应该对一件事情负责,并且这种责任应该由该类封装。

在您的情况下,ViewController负责Cell的子视图布局和调整。在SOLID中至少破坏〜 S

P.S。。老实说,由于经常会争论良好的软件设计,我有点害怕写这个答案。

答案 1 :(得分:1)

通常来说,建议您不要将构成复选框的代码放在cellForRowAt中,因为@fewlinesofcode可以很好地说明这一点。以下是我个人建议回答您问题的两种其他选择。希望这会有所帮助...

选项1:

class CustomTableViewCell: UITableViewCell {
    @IBOutlet var customCheckbox: VKCheckbox!

    func checkBoxControl() {
        customCheckbox.line = .thin
        customCheckbox.bgColor = UIColor.white
        customCheckbox.color = UIColor.black
        customCheckbox.borderColor = UIColor.black
        customCheckbox.borderWidth = 2
        customCheckbox.cornerRadius = customCheckbox.frame.height / 2
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TransactionsTableViewCell else { return UITableViewCell() }
    cell.checkBoxControl()
    return cell
}

选项2:

class CustomTableViewCell: UITableViewCell {
    @IBOutlet var customCheckbox: VKCheckbox!

    override func awakeFromNib() {
        super.awakeFromNib()

        customCheckbox.line = .thin
        customCheckbox.bgColor = UIColor.white
        customCheckbox.color = UIColor.black
        customCheckbox.borderColor = UIColor.black
        customCheckbox.borderWidth = 2
        customCheckbox.cornerRadius = customCheckbox.frame.height / 2
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TransactionsTableViewCell else { return UITableViewCell() }
    return cell
}