2016-09-14 2 views
1

Я пытаюсь создать PickerView внутри tableViewCell. Я сделал свои пользовательские сотовые протоколы UIPickerViewDelegate и UIPickerViewDataSource. Я посылаю массив данных в ячейку от контроллера (я думаю, что это не соответствует шаблону MVC, может быть, вы также можете предложить мне, как это исправить?). Но когда tableview вызывает dequeueReusableCellWithIdentifier, ячейка вызывает функцию pickerView. Однако функция pickerView использует pickerData, который еще не инициализирован. Как это исправить?Как инициализировать UiPickerView внутри пользовательского tableViewCell?

Ниже приведен код для ячейки:

class PickerTableViewCell: UITableViewCell, UIPickerViewDelegate, UIPickerViewDataSource { 

    @IBOutlet weak var picker: UIPickerView! 
    @IBOutlet weak var title: UILabel! 
    var pickerData: Array<String>! 
    override func awakeFromNib() { 
     self.picker.delegate = self; 
     self.picker.dataSource = self; 
     super.awakeFromNib() 

    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return pickerData.count // I get fatal error here due to pickerData is nil 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return pickerData[row] 
    } 


} 

А вот код для инициализации ячейки:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("picker", forIndexPath: indexPath) as! PickerTableViewCell 
    cell.title.text = fieldModel.editFieldArray[indexPath.row].title 
    cell.pickerData = (fieldModel.editFieldArray[indexPath.row] as! PickerEditField).pickerData 
    return cell 
} 

Большое спасибо за любую помощь!

+0

Вы пробовали сделать ваш pickerData переменной необязательно, проверить его, и установить его внутри cellForRowAtIndexPath, наконец, перезагрузите компонент? – ohr

ответ

2

Ваш вопрос в том, что вы загрузите компоненты PickerView так сделать одно небольшое изменение в вашем cellForRowAtIndexPath и просто перезагрузить компоненты PickerView после установки pickerData Array.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("picker", forIndexPath: indexPath) as! PickerTableViewCell 
    cell.title.text = fieldModel.editFieldArray[indexPath.row].title 
    cell.pickerData = (fieldModel.editFieldArray[indexPath.row] as! PickerEditField).pickerData 
    cell.picker.reloadAllComponents(); 
    return cell 
} 

Также в awakeFromNib инициализации pickerData объект

override func awakeFromNib() { 
    self.pickerData = Array<String>() 
    self.picker.delegate = self; 
    self.picker.dataSource = self; 
    super.awakeFromNib() 

} 
+0

OMG, большое вам спасибо за "cell.unitPicker.reloadAllComponents()". Я бы поставил этот ответ 100 раз, если бы мог. У меня есть несколько сборщиков в расширении ячеек таблицы, которые будут отображаться пустыми при первой загрузке, но были бы идеальными, если бы я прокручивал их с экрана и обратно, или рушился, и повторно расширил их. Я уже несколько часов разрывал волосы на этом. Одна строка кода и исправлена! –

Смежные вопросы