Как создать неизвестное количество UILabels в UITableViewCell? - PullRequest
1 голос
/ 23 января 2020

Я создаю приложение iOS, которое использует UITableView для отображения событий, запланированных на следующие 7 дней.

Класс ThisWeekViewController извлекает события, сохраненные в базе данных на основе указанной даты и возвращает массив строк, содержащий имена всех событий на эту дату, с именем `projectNamesForCurrentDay.

Внутри моего TableView я использую пользовательский класс UITableViewCell с именем ThisWeekTableViewCell, который должен содержать номер дня, название дня и ниже, в виде списка в виде маркера, отображающего все проекты, запланированные на этот день:

enter image description here

Я потратил лучшую часть недели, пытаясь выяснить, как лучше всего справиться с программированием c, условным созданием и размещением меток внутри моей ячейки, но я все еще не уверен, как правильно решить эту проблему. Очевидно, что массив, содержащий мои имена событий, может быть использован для определения необходимого количества меток и свойства текста для каждой из них. Но следует ли создавать и настраивать метки внутри самой ячейки или в ViewController? И если это так, как я могу получить доступ к массиву имен событий внутри моего класса ячеек?

1 Ответ

2 голосов
/ 23 января 2020

Попробуйте это:

Я пробовал на примере. вы можете изменить его в соответствии с вашими требованиями.

Контроллер представления:

class ViewController: UIViewController {

    let dict1: [String:Any] = ["Date": "31", "Name": "Yesterday", "Meetings": ["Abc","Abc","Abc","Abc","Abc","Abc","Abc","Abc"]]
    let dict2: [String:Any] = ["Date": "1", "Name": "Today", "Meetings": ["Abc","Abc","Abc","Abc","Abc"]]
    let dict3: [String:Any] = ["Date": "2", "Name": "Tomorrow", "Meetings": ["Abc","Abc","Abc"]]

    var arrayData:[[String: Any]] = []

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        arrayData = [dict1, dict2,dict3]

        tableView.register(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "cellReuse")
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrayData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuse", for: indexPath) as! CustomTableViewCell

        cell.populate(data: arrayData[indexPath.row])
        return cell
    }
}

Пользовательская ячейка просмотра таблицы:

class CustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var stackView: UIStackView!

    func populate(data: [String: Any]) {
        dateLabel.text = data["Date"] as? String
        nameLabel.text = data["Name"] as? String

        guard let meetingsArray = data["Meetings"] as? [String] else {
            return
        }

        for views in stackView.arrangedSubviews {
            views.removeFromSuperview()
        }
        for meeting in meetingsArray {
            let label = createLabel(meeting: meeting)
            stackView.addArrangedSubview(label)
        }
    }

    func createLabel(meeting: String) -> UILabel {
        let label = UILabel()
        label.textColor = UIColor.black
        label.numberOfLines = 0
        label.text = meeting
        return label
    }
}

Пользовательская ячейка Xib:

enter image description here

Вывод в симуляторе:

enter image description here

Надеюсь, это поможет.

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