Ios 表视图在索引路径问题时重新加载行
苹果文档说:Ios 表视图在索引路径问题时重新加载行,ios,swift,uitableview,Ios,Swift,Uitableview,苹果文档说:reloadRowsAtIndexPaths:withRowAnimation: : 如果要提醒用户单元格的值正在更改,请调用此方法。但是,如果通知用户并不重要,也就是说,您只需要更改单元格显示的值,就可以获取特定行的单元格并设置其新值 我的问题场景是,我希望在单击按钮时更新单元格中的标签,并更新布局(即,根据应用的条件添加或删除单元格的新视图)。如果在按钮上调用了reloadRowsAtindexPath,单击该按钮,则tableview会随机向下滚动到tableview中的其他行
reloadRowsAtIndexPaths:withRowAnimation
:
:
如果要提醒用户单元格的值正在更改,请调用此方法。但是,如果通知用户并不重要,也就是说,您只需要更改单元格显示的值,就可以获取特定行的单元格并设置其新值
我的问题场景是,我希望在单击按钮时更新单元格中的标签,并更新布局(即,根据应用的条件添加或删除单元格的新视图)。如果在按钮上调用了reloadRowsAtindexPath
,单击该按钮,则tableview会随机向下滚动到tableview中的其他行。如果单击按钮时仅更新单元格内容,则布局未正确更新
如果有人在重新加载时遇到过同样的问题?那么结果比我预期的更棘手 下面是我如何实现它的。我真的不确定这是不是一个好方法,所以对此持保留态度。找到下面项目的链接 你需要知道两件事:
indepath
和heighttobeaded
(本例中为200)作为参数传递
竣工图将如下所示:
self.indexPath = iPath
self.cellHeight = self.defaultCellHeight + heightToBeAdded
UIView.beginAnimations("aaa", context: nil)
UIView.setAnimationDuration(1)
self.tableView.beginUpdates()
self.tableView.reloadRows(at: [iPath], with: .none)
self.tableView.endUpdates()
UIView.commitAnimations()
if heightToBeAdded > 0.0 {
self.addCellSubviews()
}
iPath
与您发送的参数相同。单元格高度是根据我上面描述的两件事计算出来的
调用委托和数据源方法时,endUpdates()
会遇到以下方法:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard let iPath = self.indexPath else { return UITableViewAutomaticDimension }
if indexPath == iPath {
return cellHeight
}
else {
return UITableViewAutomaticDimension
}
}
这将增加单元格高度。但是需要添加的实际子视图呢
为此,我们有了addCellSubviews()
,它实际上是一个在UITableViewCell子类中执行的完成块。仅在结束更新后调用此选项,因为此时将正确计算单元格高度
let yView = UIView()
yView.backgroundColor = .yellow
yView.translatesAutoresizingMaskIntoConstraints = false
self.addAsSubview(sView: yView)
NSLayoutConstraint.activate([
yView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 8),
yView.topAnchor.constraint(equalTo: self.topAnchor, constant: 8),
yView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -275),
yView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -8)
])
UIView.animate(withDuration: 1, animations: {
self.layoutIfNeeded()
})
以下是结果-
请注意,有一些注意事项(如轻敲一个单元格关闭另一个单元格),我相信您一定能够解决。这是估计行高的问题。将该值更改为其他估计值修复了不需要的滚动问题
apple文档中提到:“此外,尽量使估计的行高尽可能准确。系统根据这些估计值计算滚动条高度等项目。估计值越准确,用户体验就越无缝。”尝试行动画
none
仅设置@Rishab animation none。请分享您如何实现重新加载行的代码。
-这将有助于其他人理解您的问题并更好地提供帮助。这可能有助于@ibnetariq解决方案的工作。谢谢