从 Xib 加载的 UITableViewCell 始终具有 Nil 值

Posted

技术标签:

【中文标题】从 Xib 加载的 UITableViewCell 始终具有 Nil 值【英文标题】:UITableViewCell loaded from Xib always has Nil values 【发布时间】:2019-11-14 19:42:59 【问题描述】:

这是我的表格视图代码:

import UIKit
import Firebase

class HomeViewController: UITableViewController 

    @IBOutlet weak var labelCell: IconAndTitleTableViewCell!

    override func viewDidLoad() 
        super.viewDidLoad()

        self.tableView.register(UINib(nibName: "IconAndTitleTableViewCell", bundle: nil), forCellReuseIdentifier: "iconAndLabelCell")

        labelCell.titleView.text = "Test"    
            

这是表格视图:

这是 Xib 文件:

但我不断收到错误:

线程 1:致命错误:在隐式展开可选值时意外发现 nil

尝试设置 labelCell 时。

它的字段为零。但为什么他们是零?我已经清楚地在桌子上注册了它。

【问题讨论】:

您在代码中的哪一点出现错误? labelCell.titleView.text = "测试" 此时您还没有实例化 labelCell。您已将其注册为动态单元格以供重复使用,仅此而已。您似乎正在混淆动态和静态单元格。方法签名中有一条线索表明这是动态的 - forCellReuseIdentifier - 因为重用与静态单元格无关。如果您在 IB 而不是 XIB 中完成了单元格,这将起作用。 【参考方案1】:

您无法创建IBOutlet 的可重用元素,例如单元格。 你需要:

    符合UITableViewDataSource委托方法并实现他所有需要的方法 例如:

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "", for: indexPath)
        return cell
    
    

    你可以在cellForRowAt方法中访问你的单元格

    或者您可以使用方法 tableView.cellForRow(at: indexpath) 访问您的单元格

【讨论】:

【参考方案2】:
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"iconAndLableCell" owner:self options:nil];
labelCell = [topLevelObjects objectAtIndex:0];
labelCell.titleView.text = @"Test";

【讨论】:

以上是关于从 Xib 加载的 UITableViewCell 始终具有 Nil 值的主要内容,如果未能解决你的问题,请参考以下文章

从 Xib 加载的 UITableViewCell 始终具有 Nil 值

我可以直接从具有特定大小类或特征集合的 xib 加载 UITableViewCell 吗?

为 UITableViewCell 加载自定义 XIB

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

来自 XIB 错误的 UITableView 和 UITableViewCell?

从 XIB 加载时不遵守约束