这是我的故事板的一部分:
这是我正在运行的应用:
这是我的代码部分:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
return super.tableView(tableView, cellForRowAt: indexPath)
} else {
tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell", for: indexPath) as! SubTextFieldCell
// cell.deleteButton.isEnabled = true
// cell.subTextfield.text = "OK"
print("indexPath.row: \(indexPath.row)")
return cell
}
...
我已经在各个地方连接了按钮和文本字段,我可以保证这部分没有错,但是当我点击第一行中的“添加”按钮时,我只得到一个没有任何内容的单元格。
如果我使用像cell.deleteButton...
这样的代码,Xcode会报告错误:
线程1:致命错误:在展开时出乎意料地发现nil 可选值
然后我尝试使用viewWithTag
方法查看是否显示内容,但我仍然遇到与以前相同的错误。
这是我第一次遇到这种错误。我的其他程序中的代码和方法没有错误。
答案 0 :(得分:0)
在情节提要文件中配置自定义单元格时,您不需要致电register(_:forCellReuseIdentifier:)
,因为故事板应该为您完成。
deleteButton
为零的原因是因为通过重新注册单元格类,您覆盖了为您注册的故事板。通过使用该重用标识符出列而创建的所有单元格都不会与故事板连接,只是为空。
假设所有@IBOutlet
和重用标识符和事物都已设置(你说你做了),那么只需使用故事板中设置的重用标识符将单元格出列。
出列单元格示例:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
if indexPath.row == 0 {
return super.tableView(tableView, cellForRowAt: indexPath)
} else {
// Registering again is unnecessary, because the storyboard should have already done that.
// tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell") as! SubTextFieldCell
cell.deleteButton.isEnabled = true
cell.subTextfield.text = "OK"
return cell
}
} else {
...
}
}
注意:强>
即使在您需要使用表视图注册类的情况下,您也只需要执行一次。 (例如,在viewDidLoad
期间)
即使在那些时候,每次出列单元格时,都不应该>>调用它。您只是让您的应用更加努力。
将视图连接到Storyboard中的单元格
确保子视图(UIButton
等)与@IBOutlet
的属性相关联(子类代码如下所示)
示例UITableViewController
子类:
class MyTableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyFirstCell", for: indexPath) as! MyFirstTableViewCell
// Configure cell if needed
cell.myButton.setTitle("New Button Text", for: .normal)
cell.myButton.tintColor = .green
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "MySecondCell", for: indexPath) as! MySecondTableViewCell
// Configure cell if needed
cell.myTextField.backgroundColor = .red
return cell
}
}
}
示例UITableViewCell
子类:
class MyFirstTableViewCell: UITableViewCell {
@IBOutlet weak var myButton: UIButton!
}
结果: