向下滚动时不会出现 Swift Expandable tableView 单元格按钮

Posted

技术标签:

【中文标题】向下滚动时不会出现 Swift Expandable tableView 单元格按钮【英文标题】:Swift Expandable tableView cell buttons are not appearing upon scrolling down 【发布时间】:2020-05-31 17:12:23 【问题描述】:

当我的自定义单元格处于展开状态时,当滚动离开屏幕时,按钮被隐藏,这不应该是这种情况。在标签下方,再次向上滚动时不会出现 2 个按钮。我猜在单元格出列后需要发生一些事情。任何帮助将不胜感激。

我有一个自定义单元格,最初一行的高度为 80,单击该单元格后,它会扩展为 120。默认情况下,我将按钮隐藏如下:

    @IBOutlet weak var followButton: UIButton! 
        didSet 
            followButton.isHidden = true
        
    

    @IBOutlet weak var blockButton: UIButton! 
        didSet 
            blockButton.isHidden = true
        
    

我有一个var expandedIndexSet : IndexSet = [],它跟踪已扩展的单元格。 下面的方法会相应地更新 indexSet。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
        tableView.beginUpdates()
        let cell = tableView.cellForRow(at: indexPath) as! ***TableViewCell

        if(expandedIndexSet.contains(indexPath.row))
            expandedIndexSet.remove(indexPath.row)
         else 
            expandedIndexSet.insert(indexPath.row)
        

        cell.blockButton.isHidden = !cell.blockButton.isHidden
        cell.followButton.isHidden = !cell.followButton.isHidden

        tableView.endUpdates()
    

高度调整如下:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        if expandedIndexSet.contains(indexPath.row) 
            return 140
        
        else 
            return 80
        
    

【问题讨论】:

我不太确定你的用例,但didSet followButton.isHidden = true 对我来说似乎很不寻常。你到底想用这个 sn-p 做什么?你是从外面设置这些按钮吗?尝试将它们注释掉并使用awakeFromNib() 来代替最初隐藏这些按钮。还要在func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 中添加一个断点,以检查在选择单元格后是否会调用它来刷新单元格高度。 用例是当用户点击 tableView 上的单元格时,单元格应该扩大高度,以便它可以显示 2 个按钮(关注/阻止)。当用户再次点击单元格时,按钮应该被隐藏并且单元格恢复到默认大小,类似于下拉菜单效果。我已经尝试删除 didSet 属性观察者并将它们移到 awakeFromNib 但仍然没有运气。 您是否尝试在func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 中添加断点来检查该函数是否在动画期间被调用? 是的,我添加了一个断点来验证高度是否按预期调整。问题是当处于展开状态的选定单元格滚动过去并且在屏幕上不可见时,按钮被隐藏并影响其他单元格。 【参考方案1】:

下面的sn-p可能会有所帮助,请尝试。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
         let cell = ....

         cell.followButton.isHidden = !expandedIndexSet.contains(indexPath.row)
         cell.blockButton.isHidden = cell.followButton.isHidden

         return cell


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)

        // Update View Model
        if(expandedIndexSet.contains(indexPath.row))
            expandedIndexSet.remove(indexPath.row)
         else 
            expandedIndexSet.insert(indexPath.row)
        

        // Table View Animation
        tableView.beginUpdates()
        tableView.reloadRows(at: indexPaths, with: .automatic)
        tableView.endUpdates()

【讨论】:

这行得通,但是当用户关闭单元格时,它禁用了正在设置的 imageView。 ``` @IBAction func followButton(_ sender: Any) if isFollowingUserImage.isHidden isFollowingUserImage.isHidden = false followButton.setTitle("Unfollow", for: .normal) else isFollowingUserImage.isHidden = true followButton.setTitle("跟随”,对于:.normal) ``` 不确定it has disabled an imageView being set when the user closes the cell 到底是什么意思,当用户点击follow 按钮时,它是您试图隐藏/取消隐藏的图像视图吗?如果您尝试更改按钮点击时单元格的高度,1. 更新可能包含是否显示图像视图信息的数据模型 2. 计算 func tableView(_ tableView: heightForRowAt indexPath:) -> CGFloat 中的新高度 3. 您需要重新加载单元格再次更新它的高度。 4. 使用模型中的数据管理单元内的约束以进行更改。 是的,这正是我在点击关注按钮时想要做的事情,它应该会出现 imageView,但是当用户再次点击单元格时,imageView 会消失,这是不正确的。当您点击单元格并展开时,它会显示 imageView。

以上是关于向下滚动时不会出现 Swift Expandable tableView 单元格按钮的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 在不同的设备上运行时不会滚动或部分滚动 swift

键盘消失时,UIScrollView 不会向下滚动到其原始位置

Swift - 滚动时缩小导航栏

Swift - 在页面滚动时隐藏/显示“tableHeaderView”

为啥我的 tableView 不向下滚动就不会更新?

当我滚动 TableView 时 UItextField 数据消失了——Swift