我在Swift工作,其中一个TableViewController
有一个原型单元格。单元格具有在故事板中指定的重用标识符,但它从未正确地出列。在打开一个Optional值时,我总是得到"意外发现的nil"错误。
我已正确注册课程如下:
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myNewCell")
违规代码是:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("myNewCell") as UITableViewCell
let textField = cell.viewWithTag(123) as UITextField
textField.text = "test"
return cell
}
我觉得我已经尝试过这里的一切,但它从来没有正确地给出一个带有该标识符的单元格。即使使用回退(如果为nil,创建具有该标识符的单元格)仍会出现错误。它确实无法获取具有该标识符的单元格,但它已在故事板中注册和指定...非常感谢任何帮助!
答案 0 :(得分:4)
使用单元格原型时,不要调用registerClass
。故事板为您做到了这一点。如果单元格原型指定了其标识符,那么只需要所有dequeueReusableCellWithIdentifier
,它应该找到您的单元格原型而不会发生意外。
我建议在故事板中检查标识符的拼写/大小写,并确保它与cellForRowAtIndexPath
代码中使用的内容相同。
我注意到您正在尝试使用标签号访问单元格的标签。如今,在处理自定义单元格布局时,我们通常会创建自己的表视图子类,例如:
// CustomTableViewCell.swift
import UIKit
class CustomTableViewCell: UITableViewCell {
@IBOutlet weak var customTextField: UITextField! // note, I would use something other than textLabel to avoid confusion with base class
}
然后我们转到我们的单元格原型并指定其基类:
我们还设置了单元原型的标识符:
然后我们将单元格原型和自定义类@IBOutlet
之间的插座连接起来。
完成所有这些后,cellForRowAtIndexPath
将是:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myNewCell", forIndexPath: indexPath) as CustomTableViewCell
cell.customTextField.text = "Row \(indexPath.row)"
return cell
}
答案 1 :(得分:-4)
如果dequeueReusableCellWithIdentifier给你带来问题,那就不要使用它。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell()
let textField = cell.viewWithTag(123) as UITextField
textField.text = "test"
return cell
}