如何在自定义tableViewCell中初始化UiPickerView?

时间:2016-09-14 15:40:46

标签: ios swift uitableview uipickerview

我正在PickerView内创建tableViewCell。我使自定义单元格符合UIPickerViewDelegateUIPickerViewDataSource协议。我从控制器发送数据数组到单元格(我认为这不符合MVC模式,你可以建议我如何解决这个问题吗?)。但是当tableview调用dequeueReusableCellWithIdentifier时,单元格会调用pickerView函数。但是,pickerView函数使用尚未初始化的 pickerData 。我该如何解决这个问题?

以下是我的单元格代码:

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
}

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的问题是您已重新加载PickerView的组件,因此请在cellForRowAtIndexPath中进行一处小更改,然后在设置PickerView数组后重新加载pickerData的组件

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()

}