自定义 UITableViewCell 内的 UIPickerView 未初始化,未调用 awakeFromNib()
UIPickerView inside a Custom UITableViewCell not initialising, awakeFromNib() not being called
我正在尝试加载自定义 UITableViewCell
中的 UIPickerView
。单元格加载正常,我能够通过委托将数据(字符串数组)从 UITableViewController
传递到自定义单元格,但选择器只是加载空白。我这辈子都想不通为什么。
但建议的解决方案(即在 cellForRowAt
方法中设置 pickerData
数组后重新加载 UIPickerView
的组件)似乎没有工作。
非常感谢任何帮助或见解。
带有 UIPickerView
的自定义单元格
class GradeSelectionCell: UITableViewCell, UIPickerViewDataSource, UIPickerViewDelegate, ReusableView {
@IBOutlet var pickerView: UIPickerView!
var pickerData = [String]()
var numComponents = Int()
override func awakeFromNib() {
// Initialization code
self.pickerData = Array<String>()
self.pickerView.delegate = self
self.pickerView.dataSource = self
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return numComponents
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
print(pickerData[row])
return pickerData[row]
}
}
extension GradeSelectionCell: PickerSetupDelegate {
func setupPicker(data: [String], numberOfCompents: Int){
pickerData = data
numComponents = numberOfCompents
print("PickerSetupDelegate Called")
print("pickerData \(String(describing: pickerData))")
}
}
cellForRowAt
let cell = tableView.dequeueReusableCell(withIdentifier: "GradeSelectionCell", for: indexPath) as! GradeSelectionCell
cell.setupPicker(data: grades, numberOfCompents: 1)
// cell.pickerView.reloadAllComponents()
return cell
正在 viewDidLoad
中注册单元格
tableView.register(GradeSelectionCell.self, forCellReuseIdentifier: "GradeSelectionCell")
您正在使用 cell class initializer:
注册单元格
func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
但您似乎正在尝试从 xib 初始化单元格。所以你应该使用 UINib
initializer:
func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
例如
tableView.register(UINib(nibName: "GradeSelectionCell", bundle: nil), forCellReuseIdentifier: "GradeSelectionCell"))
(或者你正在使用的 xib 的任何文件名)。
否则,您只是直接加载 class 的一个实例,而没有您在 xib 中布置的用户界面。
请注意,如果您在控制器视图中使用情节提要中定义的单元格,那么它已经被注册,您不需要再次注册。
它不会崩溃,因为您实际上从未调用 pickerView
属性 — awakeFromNib
不会被调用,而 setupPicker
只是设置数据。当您取消注释行 cell.pickerView.reloadAllComponents()
?
时,它可能会崩溃
我正在尝试加载自定义 UITableViewCell
中的 UIPickerView
。单元格加载正常,我能够通过委托将数据(字符串数组)从 UITableViewController
传递到自定义单元格,但选择器只是加载空白。我这辈子都想不通为什么。
cellForRowAt
方法中设置 pickerData
数组后重新加载 UIPickerView
的组件)似乎没有工作。
非常感谢任何帮助或见解。
带有 UIPickerView
class GradeSelectionCell: UITableViewCell, UIPickerViewDataSource, UIPickerViewDelegate, ReusableView {
@IBOutlet var pickerView: UIPickerView!
var pickerData = [String]()
var numComponents = Int()
override func awakeFromNib() {
// Initialization code
self.pickerData = Array<String>()
self.pickerView.delegate = self
self.pickerView.dataSource = self
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return numComponents
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
print(pickerData[row])
return pickerData[row]
}
}
extension GradeSelectionCell: PickerSetupDelegate {
func setupPicker(data: [String], numberOfCompents: Int){
pickerData = data
numComponents = numberOfCompents
print("PickerSetupDelegate Called")
print("pickerData \(String(describing: pickerData))")
}
}
cellForRowAt
let cell = tableView.dequeueReusableCell(withIdentifier: "GradeSelectionCell", for: indexPath) as! GradeSelectionCell
cell.setupPicker(data: grades, numberOfCompents: 1)
// cell.pickerView.reloadAllComponents()
return cell
正在 viewDidLoad
tableView.register(GradeSelectionCell.self, forCellReuseIdentifier: "GradeSelectionCell")
您正在使用 cell class initializer:
注册单元格func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
但您似乎正在尝试从 xib 初始化单元格。所以你应该使用 UINib
initializer:
func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
例如
tableView.register(UINib(nibName: "GradeSelectionCell", bundle: nil), forCellReuseIdentifier: "GradeSelectionCell"))
(或者你正在使用的 xib 的任何文件名)。
否则,您只是直接加载 class 的一个实例,而没有您在 xib 中布置的用户界面。
请注意,如果您在控制器视图中使用情节提要中定义的单元格,那么它已经被注册,您不需要再次注册。
它不会崩溃,因为您实际上从未调用 pickerView
属性 — awakeFromNib
不会被调用,而 setupPicker
只是设置数据。当您取消注释行 cell.pickerView.reloadAllComponents()
?