自定义 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()?

时,它可能会崩溃