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

Posted

技术标签:

【中文标题】如何在自定义 tableViewCell 中初始化 UiPickerView?【英文标题】:How to initialize UiPickerView inside custom tableViewCell? 【发布时间】:2016-09-14 15:40:46 【问题描述】:

我正在尝试在tableViewCell 中创建PickerView。我使我的自定义单元符合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

非常感谢您的帮助!

【问题讨论】:

您是否尝试过将您的 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 的大小

在自定义tableviewcells中添加约束的最佳位置在哪里?