Добавьте UIViews к UIStackView программно внутри UITableView - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть три элемента UILabel, UIImageView и UIButton в списке.Я должен показать их соответственно внутри UITableView.У меня есть такой массив:

tableArray = [["label", "img", "button"],["img","button","label"],["img","label","button"],["button", "img", "label"]]

Позиции элементов такие же, как их позиции (индекс) внутри массива.Мой cellForRowAt выглядит следующим образом:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "FirstTableViewCell", for: indexPath) as? FirstTableViewCell else {
        return UITableViewCell()
    }

    let tableData = tableArray[indexPath.row]

    var count = 0
    tableData.forEach { (element) in
        switch element {
        case "label":
            let lbl = self.createLabel()

            cell.stackView.insertArrangedSubview(lbl, at: count)
            count += 1
            break
        case "img":
            let img = self.createImage()
            cell.stackView.insertArrangedSubview(img, at: count)
            count += 1
            break
        case "button":
            let btn = self.createButton()
            cell.stackView.insertArrangedSubview(btn, at: count)
            count += 1
            break
        default:
            break
        }
    }
    return cell
}

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

Iпопробовал несколько решений для решения этой проблемы, но не повезло.

  1. if tableView.cellForRow(at: indexPath) == nil, затем добавьте элементы в просмотры стека.

  2. Проверка if cell == nil после dequeueReusableCell.Если ноль, то init ячейка.

  3. let cell = UITableViewCell.init(style: .default, reuseIdentifier: nil) as? FirstTableViewCell пробовал даже без dequeueReusableCell.

Но каждый раз происходит то же самое.

Это FirstTableViewCell

class FirstTableViewCell: UITableViewCell {

    @IBOutlet weak var stackView: UIStackView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

Любая идея, как проверить, были ли элементы уже добавлены в StackView, тогда я не буду их добавлять.

1 Ответ

0 голосов
/ 20 февраля 2019

Поскольку ячейки используются повторно, первое, что вам нужно сделать в cellForRowAt, это «сбросить» вашу ячейку ... другими словами, очистить существующие подпредставления из представления стека:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "FirstTableViewCell", for: indexPath) as? FirstTableViewCell else {
        return UITableViewCell()
    }

    // remove the views that are currently in the stack
    cell.stackView.arrangedSubviews.forEach {
        $0.removeFromSuperview()
    }

    // the rest of your setup
    let tableData = tableArray[indexPath.row]

    var count = 0
    tableData.forEach { (element) in
    ...
}

Теперь, основываясь на представленном вами коде, если ячейки всегда содержат UILabel, UIImageView и UIButton, только в разных порядках и с разными свойствами, вы можете добавить их один раз при создании ячейки (илидобавьте их в свой прототип ячейки, если вы его используете), а затем просто переставьте их по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...