使用 RxSwift 绑定数据时如何修复 IBOutlet "unexpectedly found nil" 错误?
How to fix IBOutlet "unexpectedly found nil" error when binding data with RxSwift?
我想将我的 BehaviorRelay<[Data]>
数据从我的视图模型 class 绑定到我的 UIViewController
class 中的 UITableView
,但不幸的是我保留了收到此错误:
Unexpectedly found nil while implicitly unwrapping an Optional value: file project/ResultCell.swift, line 27
2021-04-17 15:06:32.497411+0700 project[5189:936745] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file project/ResultCell.swift, line 27
这是我所做的(在我的视图控制器中 class):
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 { [=11=] }
query.subscribe(onNext: { [unowned self] query in
self.viewModel.search(query ?? "") // Everytime I search something, it gives me the error
}).disposed(by: disposeBag)
}
我的视图模型class:
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:
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
和 [=20] 使用 .xib
文件=] 文件)。因为我正在学习 RxSwift,所以我不想为我的 UITableView
使用任何委托和数据源。我猜这个错误是因为单元格没有正确加载,所以 IBOutlets 还没有初始化。但我不确定如何解决错误。有办法解决吗?
您已根据重复使用标识符注册了单元格 class。这只是在不引用您的 XIB 文件的情况下实例化您的单元实例,因此插座未连接。
您需要根据重用标识符注册 XIB 文件。
private func setupUI() { // Called in viewDidLoad()
resultsTv.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: ResultCell.IDENTIFIER)
}
我想将我的 BehaviorRelay<[Data]>
数据从我的视图模型 class 绑定到我的 UIViewController
class 中的 UITableView
,但不幸的是我保留了收到此错误:
Unexpectedly found nil while implicitly unwrapping an Optional value: file project/ResultCell.swift, line 27 2021-04-17 15:06:32.497411+0700 project[5189:936745] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file project/ResultCell.swift, line 27
这是我所做的(在我的视图控制器中 class):
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 { [=11=] }
query.subscribe(onNext: { [unowned self] query in
self.viewModel.search(query ?? "") // Everytime I search something, it gives me the error
}).disposed(by: disposeBag)
}
我的视图模型class:
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:
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
和 [=20] 使用 .xib
文件=] 文件)。因为我正在学习 RxSwift,所以我不想为我的 UITableView
使用任何委托和数据源。我猜这个错误是因为单元格没有正确加载,所以 IBOutlets 还没有初始化。但我不确定如何解决错误。有办法解决吗?
您已根据重复使用标识符注册了单元格 class。这只是在不引用您的 XIB 文件的情况下实例化您的单元实例,因此插座未连接。
您需要根据重用标识符注册 XIB 文件。
private func setupUI() { // Called in viewDidLoad()
resultsTv.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: ResultCell.IDENTIFIER)
}