等待 UITableView 完成插入

Posted

技术标签:

【中文标题】等待 UITableView 完成插入【英文标题】:Wait for UITableView to finish insert 【发布时间】: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 行放一点延迟。 ***.com/a/51815888/2567725 您可能还必须考虑,self.tableView.cellForRow(at: newIndex) 返回的单元格可能不可见,因此不能成为第一响应者。还要检查你是否在插入后调用reloadData() 之类的东西,这可能会重置第一响应者。 【参考方案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() 

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

【讨论】:

键盘弹出时滚动可见

以上是关于等待 UITableView 完成插入的主要内容,如果未能解决你的问题,请参考以下文章

等待用户完成与 UITableView 的交互

UIViewController 内的 UITableView? [关闭]

水平 UITableView 中的垂直 UITableView

IOS UITableView检查一个单元格

等待批量插入存储过程完成

UITableView 复选标记重复