2016-09-14 15 views
1

PickerViewtableViewCellの内部に作成しようとしています。カスタムセルをUIPickerViewDelegateUIPickerViewDataSourceプロトコルに準拠させました。私はコントローラからセルにデータ配列を送信します(これはMVCパターンに準拠しないと思います、それを修正する方法を私に提案することもできますか?)。しかし、tableviewがdequeueReusableCellWithIdentifierを呼び出すとき、セルはpickerView関数を呼び出します。ただし、pickerView関数は、まだ初期化されていないpickerDataを使用します。どうすれば修正できますか?以下はカスタムtableViewCell内でUiPickerViewを初期化する方法は?

セルのための私のコードです:

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

あなたの問題は、あなたがそうあなたのcellForRowAtIndexPath内の1つの小さな変更を加えるだけpickerDataアレイを設定した後PickerViewのコンポーネントをリロードPickerViewのコンポーネントをリロードしていることです。 awakeFromNibでも

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 
} 

あなたpickerDataオブジェクトが

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

} 
+0

OMG、 "cell.unitPicker.reloadAllComponents()"に感謝します。もし私ができるなら、私はこの答えを100回upvoteします。私は最初に読み込まれたときに空白を表示するテーブルセルを展開するいくつかのピッカーを持っていますが、それらを画面から後ろにスクロールしたり、折りたたんだり再展開したりすると完璧です。私はこの1時間で何時間も髪を裂いています。 1行のコードとそれが修正されました! –

関連する問題