Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在自定义tableViewCell中初始化UiPickerView?_Ios_Swift_Uitableview_Uipickerview - Fatal编程技术网

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

Ios 如何在自定义tableViewCell中初始化UiPickerView?,ios,swift,uitableview,uipickerview,Ios,Swift,Uitableview,Uipickerview,我正在尝试在tableViewCell内部创建PickerView。我使我的自定义单元格符合UIPickerViewDelegate和UIPickerViewDataSource协议。我将数据数组从控制器发送到单元(我认为这不符合MVC模式,也许你也可以建议我如何修复它?)。但是,当tableview调用dequeueReusableCellWithIdentifier时,单元格调用pickerView函数。但是,pickerView函数使用尚未初始化的pickerData。我该如何解决这个问题

我正在尝试在
tableViewCell
内部创建
PickerView
。我使我的自定义单元格符合
UIPickerViewDelegate
UIPickerViewDataSource
协议。我将数据数组从控制器发送到单元(我认为这不符合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]
    }


}

非常感谢你的帮助

您的问题是您必须重新加载
PickerView
的组件,因此在
cellForRowAtIndexPath
中做一个小更改,然后在设置
pickerData
数组后重新加载
PickerView
的组件

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

}
重写函数awakeFromNib(){
self.pickerData=Array()
self.picker.delegate=self;
self.picker.dataSource=self;
super.awakeFromNib()
}

您是否尝试将pickerData变量设置为可选变量,检查它,并将其设置在cellForRowAtIndexPath中,最后重新加载组件?OMG,非常感谢您的“cell.unitPicker.reloadAllComponents()”。如果可以的话,我会把这个答案投票100次。我在扩展表单元格中有几个选择器,第一次加载时会显示为空,但如果我将它们从屏幕上滚动回来,或者折叠并重新扩展它们,这将是完美的选择。在这件事上我已经扯了好几个小时了。一行代码,它是固定的!
override func awakeFromNib() {
    self.pickerData = Array<String>()
    self.picker.delegate = self;
    self.picker.dataSource = self;
    super.awakeFromNib()

}