等待 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 完成插入的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController 内的 UITableView? [关闭]