TableView 单元格致命错误:隐式解开 Optional 值时意外发现 nil

TableView Cell Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

提问人:Mert Köksal 提问时间:6/25/2022 最后编辑:Mert Köksal 更新时间:6/25/2022 访问量:212

问:

我一直在所有项目中使用相同的协议和功能。但是这个给我带来了致命的错误。

这是我的 Nibloadable

 protocol NibLoadable: class {
    static var nib: UINib { get }
}

extension NibLoadable {
    static var nib: UINib {
        return UINib(nibName: String(describing: self), bundle: Bundle(for: self))
    }
}

这是我的可重复使用

    protocol Reusable: class {
    static var reuseIdentifier: String { get }
}

extension Reusable {
    static var reuseIdentifier: String {
        return String(describing: Self.self)
    }
}

在 VideoListTableViewCell 中

static let identifier = String(describing: VideoListTableViewCell.self)
extension VideoListTableViewCell: Reusable, NibLoadable { }

在我的VideoViewController中

class VideoViewController: UIViewController, VideoModule.View  {
@IBOutlet weak var tableView: UITableView!
var presenter: VideoModule.Presenter!
var videos: [VideoModel]?

override func viewDidLoad() {
        super.viewDidLoad()
        
        presenter.fetchVideos()
        configureTableView()
    }
func configureTableView() {
        tableView.register(VideoListTableViewCell.self)
        tableView.delegate = self
        tableView.dataSource = self

extension VideoViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return configureTableViewCell(indexPath: indexPath)
    }
    
    func configureTableViewCell(indexPath: IndexPath) -> VideoListTableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: VideoListTableViewCell.identifier, for: indexPath) as! VideoListTableViewCell
        let videoData = (videos?[indexPath.row])!
        cell.configure(model: videoData)
        return cell
    }

因此,在 .register 的 configureTableView 函数中,它会抛出致命错误。我尝试添加标识符来创建我的单元格并注册 tableView,但它也没有解决这个问题。

在 .register 行,我的 tableView 是 tableView UITableView?无 无错误解释。

最后是我的 UITableView 扩展

extension UITableView {
  
    func register<T: UITableViewCell>(_: T.Type) where T: Reusable, T: NibLoadable {
        register(T.nib, forCellReuseIdentifier: T.reuseIdentifier)
    }
    
    func dequeueReusableCell<T: UITableViewCell>(forIndexPath indexPath: IndexPath) -> T where T: Reusable {
        guard let cell = dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
            fatalError("Could not dequeue cell with identifier \(T.reuseIdentifier)")
        }
        return cell
    }

我试过使用VIPER,所以这是我的VideoContract

 protocol VideoModuleViewProtocol: AnyObject {
  var presenter: VideoModule.Presenter! { get set }
  
}

protocol VideoModuleInteractorProtocol: AnyObject {
  var presenter: VideoModule.Presenter? { get set }
  
  func fetchVideos()
}

protocol VideoModulePresenterProtocol: AnyObject {
  var view: VideoModule.View? { get set }
  var interactor: VideoModule.Interactor! { get set }
  var router: VideoModule.Router! { get set }

    func fetchVideos()
    func didFetch(videos: [VideoModel])
}

protocol VideoModuleRouterProtocol: AnyObject {
  
}

struct VideoModule {
  typealias View = VideoModuleViewProtocol
  typealias Interactor = VideoModuleInteractorProtocol
  typealias Presenter = VideoModulePresenterProtocol
  typealias Router = VideoModuleRouterProtocol
}

我已将故事板文件创建为 VideoListTableViewCell.xib,并同时创建了两个 tableviewcell 文件。一切都连接到正确的地方。

我怎样才能克服这个毫无意义的问题?

swift uitableview null 选项类型 tablecell

评论

0赞 Larme 6/25/2022
所以如果你之前这样做,它会崩溃,对吧?所以,它崩溃了,因为它是,它不应该。如果是这样的话,现在不要关心注册,这不是问题。那么,实例是如何创建的呢?print(tableView)tableView.register(...)tableViewnilVideoViewController
0赞 Mert Köksal 6/25/2022
更新了我的代码,让您看得更清楚。
0赞 Larme 6/25/2022
我看不出您在哪里初始化实例。如果你在某个时候写了,那就是初始化,这是一个错误。但我无法证实。或者您使用的是 ?VideoViewControllerVideoViewController()segue
0赞 Mert Köksal 6/25/2022
我没有使用 segue。我应该在 Viper 中在哪里初始化 VC?
0赞 Larme 6/25/2022
我不是VIPER的用户,我了解它的原理,但从未使用过它。你至少在某个地方写过或类似的东西,不是吗?你不是凭空被召唤的,不是吗?这不是关于在哪里(这是由VIPER决定的),而是关于如何。如果你确实写了,那么,这就是问题所在。但我正在寻找对此的确认......VideoViewController()viewDidLoad()VideoViewController()

答: 暂无答案