Swift TableViewController reuseIdentifier永远不会工作

时间:2014-10-31 16:44:56

标签: ios xcode swift

我在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,创建具有该标识符的单元格)仍会出现错误。它确实无法获取具有该标识符的单元格,但它已在故事板中注册和指定...非常感谢任何帮助!

2 个答案:

答案 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

}

然后我们转到我们的单元格原型并指定其基类:

cell base class

我们还设置了单元原型的标识符:

enter image description here

然后我们将单元格原型和自定义类@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
}