这是一个持续的话题,但我的情况略有不同。我正在与 this tutorial 合作。我有一个视图控制器,它有自己的故事板,这个视图控制器有表视图。视图控制器是该表的委托和数据源。我需要向这个表格添加不同类型的单元格,我也为此使用了单元格视图模型。
单元格:
class TitleTextCell: UITableViewCell, CellConfigurable {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var textView: UITextView!
static let identifier = "TitleTextCell"
func setup(viewModel: RowViewModel) {
guard let titleTextViewModel = viewModel as? TitleTextViewModel else {return}
titleLabel.text = titleTextViewModel.title //fatal: found nil while
textView.text = titleTextViewModel.text //unwrapping an optional value
}
}
表视图控制器的 ViewController:
class InfoViewController: UIViewController, Storyboarded {
// MARK: - Properties
var viewModel: InfoViewModelType! {
didSet {
viewModel.viewDelegate = self
}
}
// MARK: - Outlets
@IBOutlet weak var tableView: UITableView!
// MARK: - Lifecycle Methods
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(TitleTextCell.self, forCellReuseIdentifier: TitleTextCell.identifier)
tableView.delegate = self
tableView.dataSource = self
}
}
extension InfoViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.tableRows.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let rowViewModel = viewModel.tableRows[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier(for: rowViewModel), for: indexPath)
if let cell = cell as? CellConfigurable {
cell.setup(viewModel: rowViewModel)
}
return cell
}
private func cellIdentifier(for viewModel: RowViewModel) -> String {
switch viewModel {
case is TitleTextViewModel:
return TitleTextCell.identifier
default:
fatalError("Unexpected view model type: \(viewModel)")
}
}
}
单元格是一个 xib 文件。插座与文件所有者相连(见屏幕)。
它确实到达了
func setup(viewModel: RowViewModel)
点,这意味着它是正确的。但是插座在运行时为零,我错过了什么?
答案 0 :(得分:2)
你需要
tableView.register(UINib(nibName: "TitleTextCell", bundle: nil), forCellReuseIdentifier: TitleTextCell.identifier)
对于xib单元