【问题标题】:Wait for UITableView to finish insert等待 UITableView 完成插入
【发布时间】:2022-01-04 06:50:29
【问题描述】:

我正在尝试插入一个新行,并立即使其成为第一响应者。

使用.insertRows() 似乎是异步执行的,即使使用.none。为动画。这意味着当我调用 cellForRow(at:) 时,它返回 nil。

在调用becomeFirstResponder之前等待插入完成的最佳方法是什么?

这不起作用:

self.tableView.insertRows(at: [newIndex], with: .none)
self.tableView.cellForRow(at: newIndex)?.becomeFirstResponder() //Returns nil

【问题讨论】:

  • 我认为你可以使用DispatchQueue.main.async。将这两行都放在主队列中。
  • 这一切都发生在主线程上
  • 然后为 cellForRow 行放一点延迟。
  • 您可能还必须考虑,self.tableView.cellForRow(at: newIndex) 返回的单元格可能不可见,因此不能成为第一响应者。还要检查你是否在插入后调用reloadData() 之类的东西,这可能会重置第一响应者。

标签: swift uitableview


【解决方案1】:

为什么必须使用 .insertRaws()?我的意思是,你为什么不在向数组添加新项目后调用 reloadData() 呢?

注意:我更新了代码并在 Xcode 中进行了测试。谢谢 vadian 和 Will。

    array.append(newItem)
    tableView.reloadData()  // It is required.

    let newIndex = IndexPath(row: array.count - 1, section: 0)
    let cell = tableView.cellForRow(at: newIndex)!
    cell.becomeFirstResponder()

    // If animation is needed
    let transition = CATransition()
    transition.type = CATransitionType.reveal
    cell.layer.add(transition, forKey: nil)

【讨论】:

  • 这行不通。表视图的最后一个索引是.count - 1,而count 不是函数。
  • 这根本不允许动画
【解决方案2】:

insertRows(at:with:) 调用放在beginUpdates()endUpdates() 调用之间:

self.tableView.beginUpdates()
self.tableView.insertRows(at: [newIndex], with: .none)
self.tableView.endUpdates()

self.tableView.cellForRow(at: newIndex)?.becomeFirstResponder() 

无论如何,我不太喜欢以这种方式让作为第一响应者的单元格:如果它不可见怎么办?

【讨论】:

  • 键盘弹出时滚动可见
猜你喜欢
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多