无法从xib文件中使用dequeueReusableCell(withIdentifier:for :)

时间:2017-08-13 23:29:35

标签: ios swift tableview

我无法在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
}

我在viewDidLoad()注册了我的单元格:

tableView.register(TextFieldTableViewCell.self, forCellReuseIdentifier: "TextFieldcell")

我得到一个错误说:

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
    }
}

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

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

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

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

    我创建此代码的原因如下:因为我使用.xib文件和界面构建器创建了自定义表视图单元格,所以我需要将xib加载到我的tableViewController中(如果我错了,请更正我){ {1}}功能。

    但是,当我运行代码时,我收到一条错误消息:tableView.register(nibName: forCellReuseIdentifier:)

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

    reason: 'Could not load NIB in bundle: 'NSBundle

    有人能看出问题所在吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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

func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)

方法。例如:

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

如果您的UITableViewCell子类完全是用代码创建的,那么您应该使用

func register(_ cellClass: Swift.AnyClass?, forCellReuseIdentifier identifier: String) 

方法。

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

答案 1 :(得分:2)

您需要注册您的笔尖对象。

在viewDidLoad()中:

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

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