我正在尝试在自定义UITableViewCell中获取一个UIPickerView进行加载。单元格加载正常,我可以通过委托将TableViewController中的数据(字符串数组)传递给自定义单元格,但选择器仅加载空白。我无法一生找出原因。
[This seems to be a similar issue,但是建议的解决方案(即在cellForRowAt方法中设置pickerData数组后重新加载PickerView的组件)似乎不起作用。
非常感谢任何帮助或见解。
自定义单元格为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:
UINib
例如
func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)
(或您使用的xib的任何文件名是。)>
否则,您只是直接加载类的实例,而没有在xib中布置的用户界面。
注意,如果您使用的是在控制器视图中的情节提要中定义的单元格,则该单元格将已经被注册,因此您无需再次注册。
尽管,我不知道这是否真的是问题所在,因为只要您按下tableView.register(UINib(nibName: "GradeSelectionCell", bundle: nil), forCellReuseIdentifier: "GradeSelectionCell"))
属性,它就应该崩溃。