【问题标题】:UISwitch animation broken when embedded in UITableView嵌入 UITableView 时 UISwitch 动画损坏
【发布时间】:2023-04-02 20:20:01
【问题描述】:

我观察到当 UISwitch 用于表格视图行时,切换动画并不总是完成。开关的背景保持灰色而不是再次变为白色。 video 和下图显示了问题。有谁知道为什么会这样?这似乎是一个错误,但也许我错过了一些东西。

代码在here可用。

【问题讨论】:

  • 感谢@scrrr 的提问,除此之外——iOS 上的时钟应用程序与 UISwitch 存在相同的错误

标签: ios swift uitableview uiswitch


【解决方案1】:

我认为这是主线程上的可重用问题。您可以使用下面的代码在主线程异步上运行切换操作

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? Cell {
        cell.theSwitch.row = indexPath.row
        DispatchQueue.main.async {
            cell.theSwitch.setOn(self.array[indexPath.row], animated: false)
        }

        return cell
    }

    return UITableViewCell()
}

【讨论】:

  • 这行得通!好的,所以我们在 UIKit 中遇到了问题,再次排队作为一种解决方法很有帮助。 (这不是我第一次看到这个 UIKit 问题的解决方案。很酷,你提出来了。)
  • 尝试在cell.theSwitch.setOn上方打印print(Thread.isMainThread)你会得到true所以这不是问题
  • Sh_Khan:你是对的,但他的代码所做的是在下一次执行主队列时将调用排入队列。这 - 不知何故 - 解决了问题!换句话说:立即返回单元格,然后打开开关。 “cellForRowAt”中不再设置,而是稍后设置。
  • 我遇到了同样的问题,这个解决方案也为我解决了这个问题。有什么想法为什么它在没有异步调度的情况下无法工作?
  • 我遇到了类似的问题,即在切换开关后立即重新加载表格会导致此灰色背景开关。似乎重新加载中断了开关动画,所以使用DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { tableView.reloadData() } 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 2021-11-27
  • 2012-06-03
  • 2015-10-16
  • 2013-09-21
  • 2014-09-04
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多