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 已经处理了这个。它还符合UITableViewDataSource
和UITableViewDataSource
,所以这些是无关的。
第四,不要为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 注册类