来自 .xib 文件的自定义 UITableViewCell

Posted

技术标签:

【中文标题】来自 .xib 文件的自定义 UITableViewCell【英文标题】:Custom UITableViewCell from a .xib file 【发布时间】:2018-02-17 20:30:22 【问题描述】:

我正在尝试使用 .xib 文件中的自定义 UITableViewCell

在我拥有 UITableView 的 ViewController 中,我已经执行了以下操作:

Ctrl + 将 tableViewDataSource 和 tableViewDelegate 拖到 Interface Builder 中的这个 View Controller。

还有这段代码:

    import UIKit

    class ResultsFoundViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

        @IBOutlet weak var tableView: UITableView!

        override func viewDidLoad() 
            super.viewDidLoad()

            self.tableView.dataSource = self;
            self.tableView.delegate = self;

       //Register my Custom Cell
            let customCellName = String(describing: ResultsFoundTableViewCell.self);
            let customCellNib = UINib.init(nibName: customCellName, bundle: nil);
            self.tableView.register(customCellNib, forCellReuseIdentifier: customCellName);
        

        public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
            return 5;
        

        // MARK: UITableViewDataSource Functions

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
            let cell = tableView.dequeueReusableCell(withIdentifier: "ResultsFoundTableViewCell", for: indexPath) as! ResultsFoundTableViewCell;
            cell.lbStoreName.text = "Name";

    return cell;
             

在 CustomCell 中,我只有一个标签以使其更简单:

import UIKit

class ResultsFoundTableViewCell: UITableViewCell 

    @IBOutlet weak var lbStoreName: UILabel! 

我得到的错误是:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效的笔尖注册 对于标识符 (ResultsFoundTableViewCell) - nib 必须完全包含 一个必须是 UITableViewCell 实例的***对象'

你知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

这个问题的原因是你必须把你所有的UI组件放在cell->contentView里面,如果有任何元素不在里面,nib注册就会失败

也可以在没有描述的情况下进行 nib 声明

    let customCellNib = UINib.init(nibName: "nibClassName", bundle: nil);
    self.tableView.register(customCellNib, forCellReuseIdentifier: customCellName);

这里是String(describing

  let customCellName = String(describing: ResultsFoundTableViewCell.self);

像这样 Optional("nibClassName") 为字符串内容添加可选项

【讨论】:

好的,单元格外的某个地方有一个元素,还没有看到。感谢那!关于 nib 声明:如果我不想像现在这样键入“nibClassName”并从类名中自动获取它怎么办?因此,如果我更改它或我没有正确编写它,它仍然可以工作。 在 nib name 与 class name 不同的情况下会有好处,但在大多数情况下它们是相同的,这很好

以上是关于来自 .xib 文件的自定义 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

显示来自 Xib 的自定义视图

来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

使用来自 XIB 的自定义 NSView/UIView 子类?

在主视图控制器的自定义单元格中使用来自 UIButton 的 IBAction

来自 NSWindowController Cocoa 的自定义视图

来自 Xib 文件的 IBAction 以分离视图控制器