Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 表视图在索引路径问题时重新加载行_Ios_Swift_Uitableview - Fatal编程技术网

Ios 表视图在索引路径问题时重新加载行

Ios 表视图在索引路径问题时重新加载行,ios,swift,uitableview,Ios,Swift,Uitableview,苹果文档说:reloadRowsAtIndexPaths:withRowAnimation: : 如果要提醒用户单元格的值正在更改,请调用此方法。但是,如果通知用户并不重要,也就是说,您只需要更改单元格显示的值,就可以获取特定行的单元格并设置其新值 我的问题场景是,我希望在单击按钮时更新单元格中的标签,并更新布局(即,根据应用的条件添加或删除单元格的新视图)。如果在按钮上调用了reloadRowsAtindexPath,单击该按钮,则tableview会随机向下滚动到tableview中的其他行

苹果文档说:
reloadRowsAtIndexPaths:withRowAnimation
: :

如果要提醒用户单元格的值正在更改,请调用此方法。但是,如果通知用户并不重要,也就是说,您只需要更改单元格显示的值,就可以获取特定行的单元格并设置其新值

我的问题场景是,我希望在单击按钮时更新单元格中的标签,并更新布局(即,根据应用的条件添加或删除单元格的新视图)。如果在按钮上调用了
reloadRowsAtindexPath
,单击该按钮,则tableview会随机向下滚动到tableview中的其他行。如果单击按钮时仅更新单元格内容,则布局未正确更新


如果有人在重新加载时遇到过同样的问题?

那么结果比我预期的更棘手

下面是我如何实现它的。我真的不确定这是不是一个好方法,所以对此持保留态度。找到下面项目的链接

你需要知道两件事:

  • 默认/正常单元格高度(基本上是单元格的估计高度)
  • 将视图添加到单元后单元高度的增加(在我的示例中,我将高度设置为200)
  • 当您点击一个应该添加子视图的按钮时,您调用一个完成处理程序,将
    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解决方案的工作。谢谢