【问题标题】:Correct way to setup cell only once with a reusable cell?使用可重复使用的电池仅设置一次电池的正确方法?
【发布时间】:2017-07-28 07:43:30
【问题描述】:

我正在寻找在 Swift 中使用可重用单元的正确方法。

如何使setup 方法只被调用一次?

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "AwesomeCell")
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "AwesomeCell") as UITableViewCell? ?? UITableViewCell()
    self.setup(cell: cell)  // I want this to be called only once
    cell.textLabel?.text = self.data[indexPath.row]
    return cell
}

func setup(cell: UITableViewCell) {
    cell.accessoryType = .disclosureIndicator
}

谢谢。

【问题讨论】:

  • 只是好奇,为什么你需要在一个单独的函数中做呢?如果您不总是想设置 cell.accessoryType = .disclosureIndicator ,为什么不在设置之前检查单元格的accessoryType 是否已经是一个disclosureIndicator?如果它变得复杂,为什么不将 UITableViewCell 子类化并对其进行适当的设置?
  • @Joshua 这只是一个例子。
  • 那么我能看到的最好的方法是子类化并在init上进行设置

标签: ios swift uitableview swift3


【解决方案1】:

如果你用类注册你的单元格,那么你应该把它放在你的单元格的 init(style:reuseIdentifier:) 初始化器中。当您调用 dequeueReusableCell(withIdentifier:for:) 时,即被称为它的初始化程序,表视图还不能重用它。

如果你在 Xib 注册了 cell,请使用 cell 的init(coder:)

【讨论】:

  • 如果我理解正确,最好的方法是创建一个自定义单元类,并在它的初始化中进行设置,然后注册该自定义单元?
  • 是的。如果您不需要对单元格做任何其他事情,您可以只覆盖适当的初始化程序并进行设置。
【解决方案2】:

在课堂上UITableViewCell。试试这个:

  override func awakeFromNib() {
       super.awakeFromNib()
       self.accessoryType = .disclosureIndicator
  }

如果您想在情节提要或 xib 上创建单元格。您可以转到附件属性并选择披露指标

【讨论】:

  • 任何类的 UITableViewCell 都有 awakeFromNib ()
  • 是的,但是如果单元格是纯粹用代码创建的,没有 Xib 或 Storyboard,那么显然它不会调用 awakeFromNib
  • 如果单元格是在故事板或 xib 上创建的。可以设置附件属性,选择disclosureIndicator
  • .disclosureIndicator 只是一个例子,如果我想在单元设置期间做更多“复杂”的事情怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多