Custom UITableViewCell内部的UIPickerView未初始化,未调用awakeFromNib()

问题描述 投票:0回答:1

我正在尝试在自定义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")
ios swift uitableview uipickerview
1个回答
0
投票

您正在使用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")) 属性,它就应该崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.