当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets

UITableViewCell nil IBOutlets when UITableView is declared in nib

首先,抱歉,如果我说的有误,因为这是我第一次尝试使用 nibs。

我有一个用 nib 文件初始化的 UIViewController "MainVC"(我决定这样做是因为它是一个弹出窗口并且更有意义)我想在一个中嵌入另一个视图控制器 "RenderersViewController"用户界面视图。为此,我这样做:

override func viewDidLoad() {
    super.viewDidLoad()

    let renderersVC = RenderersViewController(withRowHeight: 42)
    addChild(renderersVC)
    renderersVC.view.frame = renderersContainerView.bounds
    renderersContainerView.addSubview(renderersVC.view)
    renderersVC.didMove(toParent: self)

}

RenderersViewController 是具有 UITableView 的 UIViewController,它具有自定义初始化和 nib

init(withRowHeight rowHeight:CGFloat) {
    self.rowHeight = rowHeight

    super.init(nibName: "RendererVCNib", bundle: nil)

}

当 RenderersViewController 中的 tableView didSet 时,我注册了一个自定义的 UITableViewCell,它也有自己的 nib。

@IBOutlet weak var renderersTableView: UITableView!{
    didSet{
        renderersTableView.register(RenderersTableViewCell.self, forCellReuseIdentifier: "mycell")
        renderersTableView.bounces = false
        renderersTableView.dataSource = self
        renderersTableView.delegate = self
    }
}

并且在 cellForIndex

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let rendererCell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! RenderersTableViewCell

    if indexPath.row < rendererArray.count{

        let cpRendererItem = rendererArray[indexPath.row]

        //rendererCell.rendererNameLabel.text = cpRendererItem.friendlyName
        //rendererCell.rendererImageView.sd_setImage(with: cpRendererItem.iconUrl, placeholderImage: UIImage(named:"upnp_ic")!)

        rendererCell.rendererNameLabel.text = "HELLO"
        rendererCell.rendererImageView.image = UIImage(named:"upnp_ic")

    }

    return rendererCell

}

但它崩溃了,因为 IBOutlets 为零...

RenderersTableViewCell Nib

无需注册单元格的 class,您需要注册用于实例化单元格的 nib 文件:

@IBOutlet weak var renderersTableView: UITableView!{
    didSet{
        <b>let nibFile = UINib(nibName: "cells_xib_file", bundle: nil)</b>
        <b>renderersTableView.register(nibFile, forCellReuseIdentifier: "mycell")</b>
        renderersTableView.bounces = false
        renderersTableView.dataSource = self
        renderersTableView.delegate = self
    }
}

除此之外,您的 xib 文件看起来有点不对劲。对于单元格 xib,它应该有一种 UITableViewCell(对于你的情况 RenderersTableViewCell)作为层次结构中的顶视图组件。最终你应该得到类似于 this.

的东西