无法将 XIB 加载到可重用的 TableViewCell 中

Posted

技术标签:

【中文标题】无法将 XIB 加载到可重用的 TableViewCell 中【英文标题】:Cannot load XIB into reusable TableViewCell 【发布时间】:2020-12-12 14:53:25 【问题描述】:

我创建了一个 XIB 文件及其控制器来处理我的可重复使用的自定义单元格:

并设置我的 XIB 的类所有者:

class WallTableCell: UITableViewCell 
    //Outlets
    
    func setupCell() 
        setupLabels()
    
    
    func setupLabels() 
        self.title.text = "Sample Title"
        self.postDescriptionLabel.text = "Sample Description"
    

我目前有 2 个故事板,第一个故事板使用 NavigationView 连接到第二个故事板,第二个故事板包含 TabBarView,其中第一个项目包含 TableView

在这里,我在情节提要中添加了UITableViewCell

单元格的类设置为:

并且控制器的类设置为:

我在哪里注册我的 Nib 并尝试在 cellForRowAt 方法上使用它:

class WallViewController: UIViewController 
    @IBOutlet weak var messagesTable: UITableView!
    
    override func viewDidLoad() 
        loadNibForCells()
    
    
    func loadNibForCells() 
        let nib = UINib(nibName: "WallTableCell", bundle: nil)
        messagesTable.register(nib, forCellReuseIdentifier: "wallCell")
    


extension WallViewController: UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        guard let wallCell = messagesTable.dequeueReusableCell(withIdentifier: "wallCell") as? WallTableCell else 
            return UITableViewCell()
        
        
        wallCell.setupCell()
        
        return wallCell
    

但是,当我在模拟器中运行应用程序时,我总是得到一个空单元格。

我应该怎么做才能在我的 tableViewCell 中显示我的自定义 XIB 视图?

按照@Sh_Khan 的回答并添加后:

messagesTable.delegate = self
messagesTable.dataSource = self

应用程序因错误而崩溃:

Thread 1: Exception: "[<NSObject 0x600001628e70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key postDescriptionLabel"

我认为这与情节提要中的TableViewCell 是空的而不是包含WallTableCell 的组件这一事实有关

【问题讨论】:

你的.setupCell() 中有什么wallCell 这是问题中的第一个代码,它只是设置标签的文本self.title.text = "Sample Title"self.postDescriptionLabel.text = "Sample Description" @HarryJ 【参考方案1】:

如果需要,请确保设置数据源和委托

messagesTable.register(nib, forCellReuseIdentifier: "wallCell")
messagesTable.delegate = self
messagesTable.dataSource = self

【讨论】:

我像你一样添加了这两行,但现在我不断收到另一个错误,我认为这与我的 Storyboard 中的 TableViewCell 是空的而不是其中的组件有关。我将在问题的编辑中发布错误【参考方案2】:

有一个错误:Thread 1: Exception: "[&lt;NSObject 0x600001628e70&gt; setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key postDescriptionLabel",所以可能你需要解绑postDescriptionLabel,然后再将它从xib文件绑定到swift文件。

【讨论】:

【参考方案3】:

虽然我错过了添加我的 messagesTable 的数据源(这是 Sh_Khan 建议的),但后来我的错误的解决方案是我的参考出口指向“文件的所有者”而不是我的文件的出口。

所以,在选择自定义TableViewCell(不是原型)时应该是:

由于某种原因,右侧不是“标题标签”,而是“文件的所有者”

并且原型单元不应包含任何附加到它的类。

【讨论】:

以上是关于无法将 XIB 加载到可重用的 TableViewCell 中的主要内容,如果未能解决你的问题,请参考以下文章

无法从出列可重用 UITableViewCell 加载自定义单元格

使用 Xib 在 Tableview Header 中快速重新加载 CollectionView

无法从 xib 将 IBAction 连接到表视图

自定义tableview的xib怎么加载

Tableview 单元格可重用性,切割标签文本

如何将表格视图的大小赋予 XIB