代码之家  ›  专栏  ›  技术社区  ›  codebot

动态更新tableview部分中的ImageView

  •  0
  • codebot  · 技术社区  · 5 年前

    我有一个包含2个(或更多)部分的表视图。我在其中添加了一个ImageView,需要根据数组开头和选择/取消选择单元格时包含的值更改图像视图。我创建了如下视图,

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let viewHeader = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 40))
        buttonCheck = UIButton(type: .custom)
        buttonCheck!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
        buttonCheck!.tag = section
        buttonCheck!.addTarget(self, action: #selector(tapSection(sender:)), for: .touchUpInside)
        viewHeader.addSubview(buttonCheck!)
    }
    

    这会很好地添加ImageView,当我最初加载表数据时,我需要通过编程设置ImageView。要改变我的图像视图,

    if tableViewData.contains(where: self.tags.contains) {
       buttonCheck!.setImage(UIImage(named: "CheckmarkCircle"), for: .normal)
    } else {
       buttonCheck!.setImage(UIImage(named: "DeselectedCheckmarkCircle"), for: .normal)
    }
    

    我把它叫进去了 didSelectRowAt didDeselectRowAt 方法这里的问题是,当我从第一节(节=0)中选择一个单元格时,它会影响到第二节(节=1)标题图像视图。在其他工作中,当我从第一部分选择一个单元格时,第二部分的标题图像正在改变。我该怎么解决这个问题?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Claudio    5 年前

    我认为问题在于你凌驾于 buttonCheck 每次 viewForHeaderInSection 被调用,这意味着它将始终包含对您创建的最后一个按钮的引用。

    如果您创建了一个字典来保存ImageView(其中索引是部分),那么在控制器作用域上这样做会更好:

    var imageViews: [Int: UIButton] = [:]
    

    然后改变 标题部分视图 为此:

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let viewHeader = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 40))
        let buttonCheck = UIButton(type: .custom)
        buttonCheck!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
        buttonCheck!.tag = section
        buttonCheck!.addTarget(self, action: #selector(tapSection(sender:)), for: .touchUpInside)
        imageViews[section] = buttonCheck
        viewHeader.addSubview(buttonCheck!)
    }
    

    然后在 didSelect didDeselect 更新imageView:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        imageViews[indexPath.section]?.setImage(UIImage(named: "CheckmarkCircle"), for: .normal)
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        imageViews[indexPath.section]?.setImage(UIImage(named: "DeselectedCheckmarkCircle"), for: .normal)
    }
    

    请考虑性能方面的问题,这可能不是最好的解决方案。最好创建一个自定义视图 UITableViewHeaderFooterView 并考虑视图的可重用性。

        2
  •  2
  •   lennartk    5 年前

    你可以采取多种方法。快速而肮脏的方法就是打电话 tableView.reloadData() ,这将强制使用数据源中的当前数据重新加载TableView中的每个元素。

    如果你想采取更高效的方法,你可以选择只通过循环来重新加载节头。这一点在很多方面都得到了很好的回答 this 问题祝你好运