当前位置: 首页 > 知识库问答 >
问题:

如何修复IBOutlet在与RXSwift绑定数据时出现的“意外发现无”错误?

桓兴腾
2023-03-14

我想将视图模型类中的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)"
    }
}

更详细地说,我正在制作一个搜索页面,该页面可以根据搜索结果显示数据(我将UIViewControllerUITableViewCell文件都使用.xib文件)。因为我正在学习RxSwift,所以我不想为我的UITableView使用任何委托和数据源。我猜这个错误是因为单元格没有正确加载,所以IBOutlets还没有初始化。但我不确定如何解决错误。有办法解决这个问题吗?

共有1个答案

陶鸿畴
2023-03-14

您已经根据重用标识符注册了cell类。这只是实例化您的单元格实例,而不引用您的XIB文件,因此没有连接出口。

您需要根据重用标识符注册XIB文件。


private func setupUI() { // Called in viewDidLoad()
    resultsTv.register(UINib(nibName: "yourNib", bundle: nil), forCellReuseIdentifier: ResultCell.IDENTIFIER) 
}

 类似资料: