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