1

我正在以编程方式创建我的 tableview

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()
}

我的 tableview 的数据源来自我的 viewmodel 中的一个 observable

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

我遇到的问题是绑定函数没有被调用tableview。observable 中显然有一些项目应该被绑定,但我所做的每一个可能的测试都从未执行过 tableview 绑定的主体。

为了证实我的理论,我在 setupBindings() 中测试了这段代码并执行了它的主体,打印出 "2019-12-01 16:36:18 | INFO | ["Recommended", "Dashboard", "Settings"] "

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

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

4

1 回答 1

2

真是愚蠢的错误。在我修复它之前,我的 tableview 约束看起来像这样

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 在评论中指出的那样,如果不显示它,就无法设置 tableview 的数据源。

于 2019-12-02T15:06:16.273 回答