使用RxSwift时未设置Tableview数据

时间:2019-12-01 21:39:27

标签: ios swift xcode reactive rxdatasources

我正在以编程方式创建表格视图

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没有调用bind函数。显然,可观察对象中有一些应该绑定的项目,但是我所做的每个可能的测试都从未执行过tableview绑定的主体。

为证实我的理论,我在setupBindings()中测试了此代码,并执行了其主体,并打印出“ 2019-12-01 16:36:18 |信息| [“推荐”,“仪表板”,“设置“]”

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

我查看了正确设置tableview数据源的文档,并做了相当多的研究。 我很困惑,需要帮助。

1 个答案:

答案 0 :(得分:0)

确实是愚蠢的错误。在修复它之前,我的表视图约束看起来像这样

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

我忘记将tableview的底部约束设置为其超级视图。根据我的推断,这阻止了在视图中显示tableview。没有显示它,就无法设置表视图的数据源,正如Arvin在评论中指出的那样。