代表和数据源无法使用UIPickerViewDelegate

时间:2015-10-10 20:04:10

标签: ios objective-c swift delegates protocols

我正在尝试为UIPickerView实现单独的数据源和委托,以便可以更加封装我的类。我有以下代表,应该在移动选择器时处理:

class LocationPickerViewDelegate : NSObject, UIPickerViewDelegate {
        let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(months[row]);
    }
}

以及将数据存储在选择器中的数据源:

class LocationPickerViewDataSource  : NSObject, UIPickerViewDataSource {
        let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return months[row]
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return months.count
    }

}

这是我在视图控制器中实现的选择器视图。我正在分配我的数据源和委托作为我的新类:

class LocationPickerView: UIPickerView, UIPickerViewDelegate {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = LocationPickerViewDelegate()
        self.dataSource = LocationPickerViewDataSource()
    }



}

但是我的数据源和委托从未使用过且选择器是空白的,所以这些方法都不会被调用。但是,如果您在视图中实现这些并设置数据源并委托给self,则整个过程都有效。有没有人知道为什么会这样?我设置的变量是错误的吗?

如果有人之前已经看过这个,并且知道出了什么问题就会很棒。

感谢。

1 个答案:

答案 0 :(得分:1)

这是强有力的参考。您需要将委托和数据源存储在变量中,因为这些是选择器视图本身的weak变量。视图控制器就是这样做的。

只需将数据源和委托变量添加到管理选择器的视图控制器。

请参阅文档声明:

weak var delegate: UIPickerViewDelegate?
weak var dataSource: UIPickerViewDataSource?