Как обновить данные и просмотреть мое настроенное подпредставление ячейки? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть настроенное представление для добавления в мою ячейку containsView.
Но когда я обновляю свои данные и использую reloadData для перезагрузки таблицы.
Вид не меняется, как будто ничего не происходит.
Я хочу добавить один элемент "A6" на мой взгляд.
Что со мной не так.
Есть идеи, чтобы обновить вид? Спасибо.

Мой вид как у следующего изображения.
Обновление элементов происходит в соответствии с массивом информации.

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 голосов
/ 05 ноября 2018

Нельзя создавать элементы внутри ячейки многократного использования. Это повлияет на производительность самого приложения. Представьте себе 1000 ячеек с таким макетом, и каждый раз, когда вы прокручиваете его, все воссоздается с нуля.

Для обновления и инициализации используется та же функция «createItemView», которая не нужна.

Вместо этого создайте собственный макет xib со всеми вашими элементами и с вашим элементом A6, который изначально скрыт Подключите все элементы из 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

    }
0 голосов
/ 05 ноября 2018

Сначала, перед обновлением ячейки, вы должны удалить из супервидения, ранее инициированного 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...