当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]

Posted

技术标签:

【中文标题】当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]【英文标题】:UITableViewCell nil IBOutlets when UITableView is declared in nib [duplicate] 【发布时间】: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 笔尖

【问题讨论】:

【参考方案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 耶!!有了图片,我看到它更清楚一点!它现在没有崩溃。我一直在努力理解文件所有者的含义。如果你附上图片和一点文件所有者的东西,我会接受并投票...... 太棒了!非常感谢!!!:) 太棒了!非常感谢!!!:)

以上是关于当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上的一个 UITableView 中加载两个不同的 nib

如何将 nib 文件中的 UITableView 加载到父视图控制器中的容器视图中?

自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

加载时 NIB 视图没有子视图

使用 NIB 无法识别 UITableViewCell 内单击的单元格 UITableView

当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?