Как программно добавлять представления в ячейку таблицы, Swift - PullRequest
0 голосов
/ 25 февраля 2020

Пожалуйста, помогите. Я хочу создать содержимое ячейки табличного представления абсолютно программно. Но это не смущает (Где я не прав? Мой код:

import Foundation
import UIKit

class FiltersMenuCell: UITableViewCell {
    var customFilters = [SearchRequestRestModelItem]()
    var filtersCounters: NSDictionary? = nil
    var isMyFilters = true

    @IBOutlet weak var mainView: UIView!

    func initFilters() {
        let customFiltersSize = customFilters.count
        var previousFilterNameLabel: UILabel? = nil
        for index in 0..<customFiltersSize {
            let filterNameLabel = UILabel()
            filterNameLabel.font = UIFont(name: Constants.regularFontName, size: 16)
            filterNameLabel.numberOfLines = 1
            filterNameLabel.lineBreakMode = .byTruncatingTail
            filterNameLabel.textColor = UIColor.black
            filterNameLabel.text = "My filters".localized

            mainView.addSubview(filterNameLabel)

            filterNameLabel.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 8).isActive = true

            filterNameLabel.trailingAnchor.constraint(equalTo: mainView.trailingAnchor, constant: 8).isActive = true
            filterNameLabel.topAnchor.constraint(equalTo: mainView.topAnchor, constant: 8).isActive = true
            filterNameLabel.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: 8).isActive = true 
            ...

Инициализация ячейки:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: Constants.filtersMenuCell) as! FiltersMenuCell
            cell.isMyFilters = indexPath.row == 4

            cell.customFilters = cell.isMyFilters ? presenter!.getMyFilters(allCustomFilters: customFilters)
                    : presenter!.getSharedFilters(allCustomFilters: customFilters)
            cell.filtersCounters = allTicketsCountModel.customFiltersCounters
            cell.initFilters()

            return cell)
    }

Почему не работает? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Возможно, ваши ограничения filterNameLabel созданы неправильно. Вам необходимо установить первое ограничение top индекса indexNameLabel равным ограничению top mainView. и последнее индексное ограничение filterNameLabel, равное нижнему ограничению mainView. И другие ограничения являются относительными, это означает, что следующее верхнее ограничение filterNameLabel равно предыдущему нижнему ограничению filterNameLabel. Всегда вызывайте метод layout при необходимости.

С другой стороны, если вы хотите использовать другой tableView внутри FiltersMenuCell, вы можете выполнить следующие действия:

1) Создать tableView внутри класса FiltersMenuCell. Инициализируйте это замыкание в этом классе.

@IBOutlet weak var tableView: UITableView!

var tableViewContentSizeHeight: CGFloat {
    view.layoutIfNeeded()
    return tableView.contentSize.height
}

2) Создайте ограничение высоты "mainView" в классе FiltersMenuCell глобально.

var mainView: UIView!
var heightConstraint: NSLayoutConstraint!

heightConstraint = mainView.heightAnchor.constraint(equalToConstant: 0)
heightConstraint.isActive = true

3) Обновление "heightConstraint" из cellForRowAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? FiltersMenuCell {
        cell.reloadData()
        cell.heightConstraint.constant = cell.tableViewContentSizeHeight
        return cell
    }
    return UITableViewCell()
}
0 голосов
/ 25 февраля 2020

Ваши ограничения на просмотры не работают, поэтому вам нужно сначала добавить

yourMainView.translatesAutoresizingMaskIntoConstraints = false
yourLabel.translatesAutoresizingMaskIntoConstraints = false   

// and add below code in you cellForRow AtIndexPath
DispatchQueue.main.async {
cell.setNeedsLayout()
cell.layoutIfNeeded()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...