Swift 自定义 UITableViewCell 标签始终为 nil

Posted

技术标签:

【中文标题】Swift 自定义 UITableViewCell 标签始终为 nil【英文标题】:Swift custom UITableViewCell label is always nil 【发布时间】:2015-03-13 15:16:32 【问题描述】:

我已经被这个问题困扰了好几天,所以如果有人可以提供帮助,我会非常高兴。 我正在尝试创建一个动态 UITableView,为此我创建了一个自定义 UITableView 子类,并且我还创建了一个自定义 UITableViewCell 子类,因为我在每个单元格中需要几个 UILabel 和一个 UIButton。 单元格已创建,但问题是标签的值始终为零,因此单元格无法正确显示。 This is,故事板的样子,以及this is 我在运行程序时看到的内容。

这是我的 UITableViewCell 子类:

import UIKit

class QuestionTableViewCell: UITableViewCell 

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!


和我的 UITableView 子类:

import UIKit

class QuestionViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet var table: UITableView!
     struct Question 
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    

    override func viewDidLoad() 
        super.viewDidLoad()
        table.estimatedRowHeight = 50
        table.dataSource = self
        table.delegate = self
        self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk?.text = "25/A"
        cell.topic?.text = "string"
        cell.answers?.text = "3"
        return cell
    

【问题讨论】:

尝试 dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 并确保您的单元格 id 匹配,如果单元格不是可选的,则不必使用 cell.labDesk?.text,只需cell.labDesk.text 我已经尝试过了,它给了我这个例外:2015-03-13 15:31:09.626 LABhelper[40046:5574601] *** 断言失败 -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:6116 如果我做对了,这就是您建议的功能后的样子: var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as QuestionTableViewCell我没有让它们成为可选的,但不知何故它们变成了可选的,所以没有 ?构建失败。 【参考方案1】:

尝试删除self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")

【讨论】:

它工作正常。但是为什么我们要删除这条线,因为它注册了 customcell 仪式? @iApple 因为该类已经存在于界面构建器中。 我删除了这条线,我的工作了。有点令人困惑,为什么我不需要它,我的猜测是在 Interface builder 中设置自定义类与注册自定义单元类的功能相同? 这是正确的,并帮助我在以下 URL 找到了我的问题的解决方案...我的笔尖/自定义单元格注册不正确gist.github.com/gonzalezreal/92507b53d2b1e267d49a 哇,超级有帮助!这也是我的问题。在我的情况下,它工作得很好,直到我滚动我的 CollectionView,一个简单的标签列表。一旦我滚动一个新行进入视图,它就会以 nil 值崩溃。谢谢!【参考方案2】:

如果您使用的是带笔尖的单元格,请确保您使用registerNib:forCellReuseIdentifier: 将单元格注册到表格视图中。如果单元格只有一个类,则使用registerClass:forCellReuseIdentifier:

【讨论】:

如果您使用的是笔尖,您需要的确切语法是:tableView.registerNib(UINib(nibName: "YOURNIBNAME", bundle: nil), forCellReuseIdentifier: "YOURREUSEID")【参考方案3】:

首先,如果该类存在于 Interface Builder 中,则您不必注册它。

其次,你应该dequeueReusableCellWithIdentifier:forIndexPath 而不是dequeueReusableCellWithIdentifier

第三,UITableViewController 已经有一个名为tableView 的属性,因此无需为table 创建一个 IBOutlet,因为 UITableViewController 已经处理了这个。它还符合UITableViewDataSourceUITableViewDataSource,所以这些是无关的。

第四,不要为table设置属性,设置为tableView

第五,cell.labDesk.text = "" 就足够了,不需要让它成为可选的。

如果您的所有 IBOutlets 都已连接,单元标识符设置正确,并且进行了这些修订,它将起作用。

class QuestionTableViewCell: UITableViewCell 

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!




class QuestionViewController: UITableViewController 

    struct Question 
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.estimatedRowHeight = 50
        tableView.dataSource = self
        tableView.delegate = self
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk.text = "25/A"
        cell.topic.text = "string"
        cell.answers.text = "3"
        return cell
    

【讨论】:

我已经告诉过你的事情会发生,如果它不是可选的,它就不会运行。 cell.student.text = "random string" 致命错误:在展开可选值时意外发现 nil 不编译还是一打开就崩溃? 一到达 UITableView 就崩溃了 因为此代码有效,所以可能是您的 IBOutlets 未正确连接 啊,你使用的是一个视图控制器,里面有一个表格视图,注意这不是 UITableViewController【参考方案4】:

最重要的部分是将包含自定义单元格的 xib 注册到表格视图中。因此在 viewDidLoad() 方法中添加如下代码。

let nib = UINib.init(nibName: "MyCustomCell", bundle: nil)    
self.tblUsers.register(nib, forCellReuseIdentifier: "MyCustomCell")

【讨论】:

【参考方案5】:

我可能来晚了,但我刚刚解决了一个类似的问题。

确保您已在 UITableViewCell 上的 InterfaceBuilder 中设置了标识符。

【讨论】:

【参考方案6】:

对于那些在尝试了所有可能的解决方案后仍试图解决这个问题的人:

断开/重新连接 Storyboard 中的 IBOutlets 应该可以解决问题!

【讨论】:

【参考方案7】:

别忘了补充:

tableView?.register(UINib(nibName: "xyz",
                           bundle: nil),
                    forCellReuseIdentifier: "abc")

【讨论】:

【参考方案8】:

如果您在 Xib 中使用表格单元格。您需要使用 .. 注册您的手机。

register(_:forCellReuseIdentifier:)

【讨论】:

【参考方案9】:

如果您没有为标签添加约束,那么尽管创建了自定义单元格,但不会创建它们。 确保添加了一些约束。

【讨论】:

欢迎@NewBe on ***,如果你能附上一些代码sn-p,它真的会帮助其他人。有关如何写好答案的更多详细信息,请访问***.com/help/how-to-answer【参考方案10】:

确保选中的单元格在右侧“module”,如有必要,继承:

如果不是,您的IBOutlets 将为零。

【讨论】:

以上是关于Swift 自定义 UITableViewCell 标签始终为 nil的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 以编程方式自定义 UITableViewCell

Swift 自定义 UITableViewCell 标签始终为 nil

多个自定义 UITableViewCell 相互覆盖 Swift

Swift 中的自定义 UITableViewCell 注册类

Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效

FirebaseUi - Swift - 将 UITableViewCell 的值转换为自定义类