我正在尝试为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,则整个过程都有效。有没有人知道为什么会这样?我设置的变量是错误的吗?
如果有人之前已经看过这个,并且知道出了什么问题就会很棒。
感谢。
答案 0 :(得分:1)
这是强有力的参考。您需要将委托和数据源存储在变量中,因为这些是选择器视图本身的weak
变量。视图控制器就是这样做的。
只需将数据源和委托变量添加到管理选择器的视图控制器。
请参阅文档声明:
weak var delegate: UIPickerViewDelegate?
weak var dataSource: UIPickerViewDataSource?