使用 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.swiftclass:

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