无法分配 UIPickerView 委托或数据源

Posted

技术标签:

【中文标题】无法分配 UIPickerView 委托或数据源【英文标题】:Cannot Assign UIPickerView Delegate or DataSource 【发布时间】:2019-02-27 16:34:28 【问题描述】:

由于某种原因,我无法将 UIPickerView 的数据源或委托给我的 NSObject。

我有一个NSObject,它扩展了UIPickerViewDataSourceUIPickerViewDelegate

class STRepeatPicker: NSObject, UIPickerViewDataSource, UIPickerViewDelegate 

    let options = ["One", "Two", "Three", "Four", "Five"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return self.options.count
    

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
        return options[row]
    


我有一个UIViewController,它试图设置数据源和委托。它是UITableViewCell 中的UIPickerView

我在顶部创建对象:

let repeatPickerDataSource = STRepeatPicker()

然后在cellForRowAt: 中尝试设置数据源和委托。

let cell = tableView.dequeueReusableCell(withIdentifier: "pickerCell", for: indexPath) as! PickerTableViewCell

cell.picker.delegate? = repeatPickerDataSource
cell.picker.dataSource? = repeatPickerDataSource

return cell

当我运行它时它会崩溃,如果我调试并尝试打印出 cell.picker.delegate 我会收到一个错误:Unexpectedly found nil while unwrapping an Optional value

有谁知道我如何将 UIPickerViewDelegate 和 UIPickerViewDataSource 分配给这样的 NSObject?

【问题讨论】:

您是否尝试在 PickerTableViewCell 类中设置委托? 是的,我可以这样做,但我不想这样做。我试图使视图尽可能通用,但能够将不同的数据源分配给单元格的不同实例。 当您在 PickerTableViewCell 类中设置 picker.delegate 时。工作正常吗? 是的,它可以正常工作而不会崩溃 【参考方案1】:

问题是我没有正确注册我的手机,我将其注册为

self.tableView.register(UIPickerViewDelegate.self, forCellReuseIdentifier: "pickerCell")

什么时候应该是这样的:

self.tableView.register(UINib.init(nibName: "PickerTableViewCell", bundle: nil), forCellReuseIdentifier: "pickerCell")

【讨论】:

以上是关于无法分配 UIPickerView 委托或数据源的主要内容,如果未能解决你的问题,请参考以下文章

是否需要保留数据源的控制器和 uiPickerview 的委托?

为 UIPickerView 创建委托和数据源

UIPickerView + TableViewCell + 委托和数据源

UIPickerView委托和数据源模板

Swift 中带有“外部”数据源和委托的 UIPickerView

UIPickerView 委托在以编程方式创建时从不调用