我在 Storyboard上有一个 ViewController 和一个 TableViewController。 TableViewController 有一个带有标签的自定义单元格。自定义单元格有自己的类 CompanyTableViewCell.swift:
import UIKit
class CompanyTableViewCell: UITableViewCell {
@IBOutlet var companyName : UILabel
init(style: UITableViewCellStyle, reuseIdentifier: String) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
println("Cell's initialised")
}
... // other default cell methods
}
在我的 TableViewController 中我有方法:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(CompanyTableViewCell.self, forCellReuseIdentifier: "CompanyCell")
println("Cell's registered")
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? {
let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell") as CompanyTableViewCell
println(cell.companyName)
cell.companyName.text = "Company name"
return cell
}
当我运行代码时,如果 TableViewController 被标记为初始 View Controller ,它运行正常,我的自定义单元格上的标签文本被成功更改。我可以看到一堆带有 Company name
的单元格。
但是当我将初始 View Controller 属性分配给 ViewController 并尝试从它访问 TableViewController 时(ViewController 有一个运行 searchByName 操作的按钮):
// ViewController.swift
@IBAction func searchByName(sender : UIButton) {
var vc = SearchTableViewController(style: UITableViewStyle.Plain)
vc.companies = self.companies
self.showViewController(vc, sender: self)
}
我对 cell.companyName.text = "Company name"
字符串有错误的应用迷恋: fatal error :无法展开 Optional.None。在前面的字符串 println(cell.companyName)
上打印 nil 到控制台,尽管在控制台中我看到单元类已注册并且单元对象已初始化。
问题是如何将文本分配给标签,我忘记了什么?以及为什么它在第一种情况下有效但在第二种情况下无效。谢谢。
最佳答案
@IBOutlet var companyName : UILabel
是一个 outlet ,如果你调用 var vc = SearchTableViewController(style: UITableViewStyle.Plain)
outlet companyName label is not initialized ,因此它是 nil ,因此访问 companyName 标签会导致崩溃。
但在第一种情况下,您是从具有 SearchTableViewController 场景的 Storyboard初始化 viewController 包含 CompanyTableViewCell 和导出 companyName 并且它连接到Cell,因此它被初始化,因此它按预期工作。
解决方案是:
如果您正在使用 Storyboard,请使用
instantiateViewControllerWithIdentifier:
方法来初始化 viewController(假设 SearchTableViewController 在 Storyboard中有 CompanyTableViewCell)。如果您以编程方式执行操作,则覆盖 CompanyTableViewCell 的所有初始化方法以创建标签并将其添加到单元格。
关于ios - 无法访问自定义单元格中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432090/