UIPickerView внутри пользовательского UITableViewCell не инициализируется, функция awakeFromNib () не вызывается - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь получить UIPickerView внутри пользовательского UITableViewCell для загрузки. Ячейка загружается нормально, и я могу передать данные (массив строк) из UITableViewController в пользовательскую ячейку через делегата, но средство выбора просто загружается пустым. Не могу понять, почему.

Это похоже на похожую проблему , но предлагаемое решение (а именно перезагрузить компоненты UIPickerView после установки* Массив pickerData в методе cellForRowAt, похоже, не работает.

Любая помощь или понимание приветствуются.

Пользовательская ячейка с 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")

1 Ответ

0 голосов
/ 11 декабря 2019

Вы регистрируете ячейку с помощью инициализатора класса ячейки :

func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

Но, похоже, вы пытаетесь инициализировать ячейку из xib. Таким образом, вы должны использовать UINib инициализатор :

func register(_ nib: UINib?, forCellReuseIdentifier identifier: String)

например,

tableView.register(UINib(nibName: "GradeSelectionCell", bundle: nil), forCellReuseIdentifier: "GradeSelectionCell"))

(или любое другое имя используемого вами файла xib).

В противном случае вы просто загружаете экземпляр класса напрямую без пользовательского интерфейса, который вы выложили в xib.

Обратите внимание, если вы используете ячейку, определенную в раскадровкес точки зрения вашего контроллера, тогда он уже будет зарегистрирован, и вам не нужно регистрировать его снова.

И он не падает, потому что вы на самом деле никогда не вызываете свойство pickerView - awakeFromNib не будетбыть вызванным, и setupPicker просто устанавливает данные. Предположительно происходит сбой, когда вы раскомментируете строку cell.pickerView.reloadAllComponents()?

...