Когда я использую UITableViewCell для настройки содержимого каждой ячейки, компоновка экрана нарушается после прокрутки в Swift4 - PullRequest
0 голосов
/ 03 июня 2019

Я хочу создать настраиваемую ячейку в UITableviewCell, чтобы я мог изменять содержимое ячейки вместе с параметром, который передается из ModelView. Однако при прокрутке макет нарушается.

Я попытался разделить код на 2 части, как показано ниже.


Объявление части переменных


Часть инициала содержит определение макета


Но если я разделю на 2 части, я не смог бы изменить макеты вместе с переменными, потому что часть Init запускалась до «Объявление частей переменных». Кроме того, я попытался изменить макеты в разделе «Объявление переменных», макеты повреждены. Как я должен код для передачи параметра для изменения содержимого ячейки? Ниже приведена часть моего кода. Макет baseView будет нарушен.

[ViewModel]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let item = items[indexPath.section]
    if let item = item as? AnniversaryViewModelContentsItem, let cell = tableView.dequeueReusableCell(withIdentifier: ANContentCell.identifier, for: indexPath) as? ANContentCell {
        cell.selectionStyle = .none
        cell.item = item.contents[indexPath.row]

        cell.contentView.setNeedsLayout()
        cell.contentView.layoutIfNeeded()
        return cell
    }
    return UITableViewCell()
}

[Cell: ANContentCell]
    // Declare Variable Part ---------------------------------------------------------------------
   ........
   var item: ANContent? {
        didSet {
            guard let item = item?.dataPerRow else {
                return
            }
            let graphArray = [graph00, graph01, graph02, graph03]

            if item.mode == 1 {
                baseView.anchor(
                    top: self.safeAreaLayoutGuide.topAnchor,
                    leading: self.safeAreaLayoutGuide.leadingAnchor,
                    bottom: self.safeAreaLayoutGuide.bottomAnchor,
                    trailing: self.safeAreaLayoutGuide.trailingAnchor,
                    padding: .init(top: 0, left:0, bottom:0, right:0), size: .init(width:0, height: item.hight )
                )
            } 

            for i in 0...(graphArray.count - 1){
                // Graph Anchor
                graphArray[i].anchor(
                    top: baseView.safeAreaLayoutGuide.topAnchor,
                    leading: baseView.leadingAnchor,
                    bottom: nil,
                    trailing: nil,
                    padding: .init(
                        top: item.top,
                        left: item.left,
                        bottom:0,
                        right:0
                    ),
                    size: .init(
                        width:item.width,
                        height: item.height
                    )
                )
                .........
            }
        }
    }

    private let baseView: UIView = {
        var baseView = UIView()
        baseView.backgroundColor = .clear
        return baseView
    }()

    var graph00: UIView = {
        let graph = UIView()
        return graph
    }()
    var graph01: UIView = {
        let graph = UIView()
        return graph
    }()
    var graph02: UIView = {
        let graph = UIView()
        return graph
    }()
    var graph03: UIView = {
        let graph = UIView()
        return graph
    }()

    // Init parts ---------------------------------------------------------------------
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let graphArray = [graph00, graph01, graph02, graph03]

        // Add Object
        addSubview(baseView)
        for i in 0...(graphArray.count - 1){
            baseView.addSubview(graphArray[i])
        }
    }


1 Ответ

0 голосов
/ 04 июня 2019

Попробуйте заменить ::

var graph00: UIView = {
        let graph = UIView()
        return graph
}()

на:

var graph00 = UIView()

и добавьте этот код в свою ячейку:

override func layoutIfNeeded() {
        self.subviews.forEach{$0.layoutIfNeeded()}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...