无法使用来自 xib 文件的 dequeueReusableCell(withIdentifier: for:)

Bre*_*ung 4 tableview ios swift

我在dequeueReusableCell(withIdentifier: for:)步骤中将我的表格视图单元格投射到我的自定义表格视图单元格时遇到了问题。

我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldcell", for: indexPath) as! TextFieldTableViewCell
    cell.labelTitle.text = array[indexPath.row]
    return cell
}
Run Code Online (Sandbox Code Playgroud)

我已在viewDidLoad()以下位置注册我的手机:

tableView.register(TextFieldTableViewCell.self, forCellReuseIdentifier: "TextFieldcell")
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

fatal error: unexpectedly found nil while unwrapping an Optional value

我敢打赌它铸造失败,这就是为什么单元格是空的。任何人都可以看到错误吗?

谢谢!

更新代码

 override func viewDidLoad() {
        super.viewDidLoad()
        let bundle = Bundle(for: TextFieldTableViewCell.self)
        let nib = UINib(nibName: "MyTableViewCell", bundle: bundle)
        tableView.register(nib, forCellReuseIdentifier: "TextFieldcell")
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldcell", for: indexPath) as! TextFieldTableViewCell
        cell.labelTitle.text = array[indexPath.row]
        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)

所以显然问题仍然存在,澄清一下,这是我创建这个自定义 UITableViewCell 所采取的步骤

  1. 创建一个 .swift 文件和一个 .xib 文件
  2. 在 .xib 文件中,我删除了样板代码并添加了两个 UILabels
  3. 我将 .xib 文件的文件所有者设置为我的 swift,它有我的两个 IBOutlets
  4. 接下来,在我想要实例化我的自定义 tableViewCell 的 tableViewController 内部,在viewDidLoad()方法内部,我添加了以下内容:

let bundle = Bundle(for: TextFieldTableViewCell.self)

let nib = UINib(nibName: "MyTableViewCell", bundle: bundle)

tableView.register(nib, forCellReuseIdentifier: "TextFieldcell")

我创建此代码的原因如下:由于我使用 .xib 文件和界面构建器创建了自定义表格视图单元格,因此我需要使用tableView.register(nibName: forCellReuseIdentifier:)函数将 xib 加载到我的 tableViewController(如果我错了,请纠正我)。

但是,当我运行代码时,我收到一条错误消息: reason: 'Could not load NIB in bundle: 'NSBundle

这是我的自定义单元格的代码:

class TextFieldTableViewCell: UITableViewCell {

    @IBOutlet weak var labelTitle: UILabel!
    @IBOutlet weak var userInput: UITextField!
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到问题出在哪里?谢谢!

Tus*_*rma 5

您需要注册您的 nib 对象。

在 viewDidLoad() 中:

let nib = UINib(nibName: "nameOfYourNibFile", bundle: nil)

tableView.register(nib, forCellReuseIdentifier: "yourIdentifier")
Run Code Online (Sandbox Code Playgroud)


bey*_*ulf 3

如果您的UITableViewCell子类是在 Interface Builder 中设计的,您应该使用

func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
Run Code Online (Sandbox Code Playgroud)

方法。例如:

let nib = UINib(nibName: "\(TextFieldTableViewCell.self)", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "TextFieldcell")
Run Code Online (Sandbox Code Playgroud)

如果您的UITableViewCell子类完全在代码中创建,您应该使用

func register(_ cellClass: Swift.AnyClass?, forCellReuseIdentifier identifier: String) 
Run Code Online (Sandbox Code Playgroud)

方法。

如果您在故事板中使用原型单元,则根本不应该注册您的单元。