Данные таблицы не устанавливаются при использовании RxSwift

Я создаю табличное представление программно

extension UITableView {
static var tableView: UITableView {
     let tableView = UITableView()
     tableView.register(UITableViewCell.self, forCellReuseIdentifier: "menuCell")
     tableView.translatesAutoresizingMaskIntoConstraints = false
     return tableView
    }
}

Я вызываю функцию привязки во время viewdidload

private func setUpBindings() {
    guard let viewModel = self.viewModel else { return }

    viewModel.menuItems
        .bind(to: tableView.rx.items(cellIdentifier: "menuCell", cellType: UITableViewCell.self)) { [weak self] row, model, cell in
            Logger.info("Called")
            cell.selectionStyle = .none
            cell.textLabel?.text = model.uppercased()
            cell.textLabel?.textColor = self?.selectedRow == row ? .white : .darkGray
            cell.backgroundColor = self?.selectedRow == row
                ? ColorPreference.mainColor
                : UIColor.clear
        }
        .disposed(by: self.disposeBag)
        self.tableView.reloadData()
}

Источник данных для моего табличного представления - из наблюдаемого в моей модели представления.

let menuItems = Observable.just([
    "Recommended",
    "Dashboard",
    "Settings"
])

У меня проблема в том, что функция привязки не вызывается для файла tableview. В наблюдаемом явно есть элементы, которые должны быть связаны, но каждый возможный тест, который я сделал, никогда не выполнял тело привязки табличного представления.

Чтобы подтвердить свою теорию, я протестировал этот код в setupBindings(), и его тело было выполнено, распечатав «2019-12-01 16:36:18 | ИНФОРМАЦИЯ | ["Рекомендуется", "Панель инструментов", "Настройки"] "

viewModel.menuItems
        .bind(onNext: { items in
            Logger.info("\(items)")
        })
        .disposed(by: self.disposeBag)

Я просмотрел документацию для правильной настройки источника данных tableview и провел немало исследований. Я в тупике, мне нужна помощь.


person Thasian    schedule 01.12.2019    source источник
comment
Вы добавили свой tableView в любое представление, прикрепленное к окну?   -  person Subramanian Mariappan    schedule 02.12.2019
comment
проверьте, импортировали ли вы RXCocoa сверху. во-вторых, методы привязки будут вызываться при обновлении пунктов меню. Если это не сработает, объявите свою модель данных (menuItems ) как behaviorRelay следующим образом: пусть menuItems: BehaviorRelay‹[String]› = BehaviorRelay(value: [Recommended, Dashboard, Settings])   -  person Help    schedule 02.12.2019
comment
как вы добавляете свое табличное представление в контроллер представления? если ваше табличное представление не отображается, функция привязки не будет выполняться   -  person Arvin Rezaei    schedule 02.12.2019
comment
Я решил свою проблему. Оказывается, я не установил нижнее ограничение моего табличного представления, из-за чего оно не отображалось. И поскольку он не отображался, элементы источника данных никогда не устанавливались.   -  person Thasian    schedule 02.12.2019


Ответы (1)


Действительно глупая ошибка. До того, как я это исправил, мои ограничения таблицы выглядели так

self.tableView.topAnchor.constraint(equalTo: appLabel.bottomAnchor, constant: 30).isActive = true
self.tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
self.tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true

Я забыл установить нижнее ограничение табличного представления на его суперпредставление. Из того, что я мог экстраполировать, это предотвратило отображение таблицы в представлении. Без его отображения невозможно установить источник данных для табличного представления, как указал Арвин в комментариях.

person Thasian    schedule 02.12.2019