如何更新数据和自定义单元格子视图的视图?

时间:2018-11-05 09:59:38

标签: ios swift uitableview

我有一个自定义视图要添加到我的单元格containView中。
但是,当我更新数据时,使用reloadData重新加载tableview。
视图不会像什么都没有发生一样发生变化。
我想在视图中添加一项“ A6”。
我怎么了
有什么想法可以刷新视图吗?谢谢。

我的看法如下图。
这些项目会更新到infos数组。

enter image description here

class ViewController: UIViewController {

    var alreadyLoadCell: Bool = false

    var initInfos = [Info(name: A1, color: UIColor.A1), Info(name: A2, color: UIColor.A2), Info(name: A3, color: UIColor.A3), Info(name: A4, color: UIColor.A4), Info(name: A5, color: UIColor.A5)]

    var updateInfos = [Info(name: A1, color: UIColor.A1), Info(name: A2, color: UIColor.A2), Info(name: A3, color: UIColor.A3), Info(name: A4, color: UIColor.A4), Info(name: A5, color: UIColor.A5), Info(name: A6, color: UIColor.A6)]         


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.row == 0 {

            let customCell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell

            if alreadyLoadCell == false {
                customCell.initCell(infos: initInfos)
                alreadyLoadCell = true
            }else{
                //TODO: reloadData to update cell
                customCell.updateCell(infos: updateInfos)
            }

            return customCell

        }

       return UITableViewCell()            
    }

}

class CustomTableViewCell: UITableViewCell {

    var testItemView: UIView?

    func initCell(infos: [Info]) {

        self.testItemView = createItemView(infos: infos)

        self.contentView.addSubview(testItemView!)

        testItemView?.snp.makeConstraints { (make) in
            make.left.equalTo(13)
            make.top.equalTo(10)
            make.right.equalTo(-13)
            make.height.equalTo(195)
            make.bottom.equalTo(-10)
        }

   }

   func updateCell(infos: [Info]) {

       self.testContainView = createItemView(infos: infos)
       //How to update successful?

   }


    func createItemView(infos: [Info]) -> UIView {

        let contentView = UIView()
        var serialNumber = 0
        var previousView: TitleView?

        for info in infos {

            let view = TitleView(assets: info, color: info.color)
            contentView.addSubview(view)
            switch serialNumber {
            case 0: //A1
                view.snp.makeConstraints { (make) in
                    make.left.equalTo(15)
                    make.width.equalTo(135)
                    make.top.equalToSuperview()
                }
                previousView = view
            case 1: //A2
                view.snp.makeConstraints { (make) in
                    make.right.equalToSuperview().offset(-15)
                    make.width.equalTo(135)
                    make.top.equalToSuperview()
                }
                previousView = view
            case 2: //A3
                view.snp.makeConstraints { (make) in
                    make.left.equalTo(15)
                    make.width.equalTo(135)                
                    make.top.equalTo((previousView?.snp.bottom)!).offset(5)
                }
                previousView = view
            case 3: //A4
                view.snp.makeConstraints { (make) in
                    make.right.equalToSuperview().offset(-15)
                    make.width.equalTo(135)
                    make.centerY.equalTo((previousView?.snp.centerY)!)
                }
                previousView = view
            case 4: //A5
                view.snp.makeConstraints { (make) in
                    make.left.equalTo(15)
                    make.width.equalTo(135) 
                    make.top.equalTo((previousView?.snp.bottom)!).offset(5)
                }
                previousView = view
            case 5: //A6
                view.snp.makeConstraints { (make) in
                    make.right.equalToSuperview().offset(-15)
                    make.width.equalTo(135)
                    make.centerY.equalTo((previousView?.snp.centerY)!)
                }
                previousView = view
            default:
                break
            }

            serialNumber += 1
        }

        return contentView
    }

}

2 个答案:

答案 0 :(得分:1)

首先,在更新单元格之前,应从早期启动的testItemView中删除超级视图,因为在updateCells方法中,您将创建testItemView的新实例,并再次为新创建的视图约束添加

我认为这段代码应该对您有用,替换您的updateCell方法:

func updateCell(infos: [Info]) {
   testContainView.removeFromSuperView
   testContainView = createItemView(infos: infos)

   contentView.addSubview(testItemView!)

   testItemView?.snp.makeConstraints { (make) in
        make.left.equalTo(13)
        make.top.equalTo(10)
        make.right.equalTo(-13)
        make.height.equalTo(195)
        make.bottom.equalTo(-10)
    }
}

答案 1 :(得分:1)

在可重复使用的单元格内重新创建元素是不合适的。那会影响应用本身的性能。想象一下,具有1000个具有这种布局的单元格,每次滚动它都会从头开始重新创建所有内容。

您使用相同的函数“ createItemView”进行更新和初始化,这是不必要的。

相反,使用所有元素和最初隐藏的A6元素创建自定义xib布局。将所有元素从xib连接到您的自定义单元格类。这样,您将始终拥有所有元素,并且只需要更新信息的值即可。

因此,在cellForRowAt函数内部,而不是调用init或update,只需更新数据即可:

customCell.someLabel.text = "example text"

    if infos.count == 6 {

        // this could mean that you have A6 in your array

        customCell.A6.isHidden = false
        customCell.A6. // change A6 element as you wish

    } else {

        customCell.A6.isHidden = true

    }