当在 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 文件仅在选择单元格后显示?