【问题标题】:UITableViewCell nil IBOutlets when UITableView is declared in nib [duplicate]当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]
【发布时间】:2018-11-04 16:56:06
【问题描述】:

首先,抱歉如果我说的有问题,因为这是我第一次尝试使用笔尖。

我有一个使用 nib 文件初始化的 UIViewController“MainVC”(我决定这样做是因为它是一个弹出窗口并且更有意义),并且我想在 UIView 中嵌入另一个视图控制器“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 是 UIViewController,它有一个 UITableView,它有一个自定义的 Initialisation 和 nib

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

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

}

当 RenderersViewController didSet 中的 tableView 注册一个自定义 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 是 nil...

RenderersTableViewCell 笔尖

【问题讨论】:

    标签: ios swift uitableview nib


    【解决方案1】:

    您需要注册用于实例化单元格的 nib 文件,而不是注册单元格的类:

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

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

    【讨论】:

    • 感谢您的回答,现在我收到“*** 由于未捕获的异常 'NSInternalInconsistencyException' 导致应用程序终止,原因:'为标识符 (mycell) 注册的 nib 无效 - nib 必须只包含一个顶层必须是 UITableViewCell 实例的对象'"
    • 是的,我错过了。在您的故事板中,顶部对象是一个通用视图,但您需要将其设置为 UITableViewCell(对于您的情况为 RenderersTableViewCell),因此视图层次结构应如下所示:i.imgur.com/TiKdxyy.png
    • 耶!!有了图片,我看到它更清楚一点!它现在没有崩溃。我一直在努力理解文件所有者的含义。如果你附上图片和一点文件所有者的东西,我会接受并投票......
    • 太棒了!非常感谢!!!:)
    • 太棒了!非常感谢!!!:)
    猜你喜欢
    • 2011-11-25
    • 2012-10-13
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多