如何在自定义 tableViewCell 中初始化 UiPickerView?
Posted
技术标签:
【中文标题】如何在自定义 tableViewCell 中初始化 UiPickerView?【英文标题】:How to initialize UiPickerView inside custom tableViewCell? 【发布时间】:2016-09-14 15:40:46 【问题描述】:我正在尝试在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]
这里是单元初始化的代码:
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
非常感谢您的帮助!
【问题讨论】:
您是否尝试过将您的 pickerData 变量设为可选,检查它,并将其设置在您的 cellForRowAtIndexPath 中,最后重新加载组件? 【参考方案1】:您的问题是您已经重新加载了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()
【讨论】:
天啊,非常感谢你的“cell.unitPicker.reloadAllComponents()”。如果可以的话,我会为这个答案投票 100 次。我在展开表格单元格时有几个选择器,它们在第一次加载时会显示为空,但如果我将它们从屏幕上滚动回来,或者折叠并重新展开它们,那将是完美的。我在这个上已经把头发扯了好几个小时了。一行代码就搞定了!以上是关于如何在自定义 tableViewCell 中初始化 UiPickerView?的主要内容,如果未能解决你的问题,请参考以下文章
在自定义 tableviewcell 中更改 UIImage
无法在自定义 TableViewCell 中编辑 UITextView
TapGestures 在自定义 TableViewCell 中不起作用
iOS:为啥在自定义 TableViewCell 中写入此文本字段的文本似乎不可读
我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小