我想将视图模型类中的BehaviorRelay<[data]>
数据绑定到UIViewController
类中的UITableView
中,但不幸的是,我一直得到以下错误:
隐式展开可选值:file Project/ResultCell.swift,第27行202 1-04-17 15:06:32.497411+0700 Project[5189:936745]时意外发现nil,致命错误:隐式展开可选值:file Project/ResultCell.swift,第27行
下面是我所做的(在我的视图控制器类中):
private func setupUI() { // Called in viewDidLoad()
resultsTv.register(ResultCell.self, forCellReuseIdentifier: ResultCell.IDENTIFIER)
}
private func setupRxBindings() { // Called in viewDidLoad()
viewModel.results.asObservable().bind(to: resultsTv.rx.items(cellIdentifier: ResultCell.IDENTIFIER, cellType: ResultCell.self)) { row, element, cell in
cell.configureData(with: element)
}.disposed(by: disposeBag)
let query = searchTf.rx.text.observe(on: MainScheduler.asyncInstance).distinctUntilChanged().throttle(.seconds(1), scheduler: MainScheduler.instance).map { $0 }
query.subscribe(onNext: { [unowned self] query in
self.viewModel.search(query ?? "") // Everytime I search something, it gives me the error
}).disposed(by: disposeBag)
}
我的视图模型类:
fileprivate final class SearchVM {
var results = BehaviorRelay<[ModelData]>(value: [ModelData]())
init() { }
func search(_ query: String) {
// Get the data from a server and store it in the results property
}
}
我的ResultCell.Swift
类:
class ResultCell: UITableViewCell {
static let IDENTIFIER = "ResultCell"
@IBOutlet weak var photoIv: UIImageView!
@IBOutlet weak var idLbl: UILabel!
@IBOutlet weak var nameLbl: UILabel!
@IBOutlet weak var miscLbl: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
func configureData(with data: ModelData) {
idLbl.text = "ID: \(data.id ?? "")" // The line that causes the error
nameLbl.text = data.name
miscLbl.text = "\(data.gender), \(data.height), \(data.phone)"
}
}
更详细地说,我正在制作一个搜索页面,该页面可以根据搜索结果显示数据(我将UIViewController
和UITableViewCell
文件都使用.xib
文件)。因为我正在学习RxSwift,所以我不想为我的UITableView
使用任何委托和数据源。我猜这个错误是因为单元格没有正确加载,所以IBOutlets还没有初始化。但我不确定如何解决错误。有办法解决这个问题吗?
您已经根据重用标识符注册了cell类。这只是实例化您的单元格实例,而不引用您的XIB文件,因此没有连接出口。
您需要根据重用标识符注册XIB文件。
private func setupUI() { // Called in viewDidLoad()
resultsTv.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: ResultCell.IDENTIFIER)
}