当在 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.
的东西
首先,抱歉,如果我说的有误,因为这是我第一次尝试使用 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.