Я пытаюсь реализовать отдельный источник данных и делегат для 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()
}
}
Однако мой источник данных и делегат никогда не используются, а сборщик пуст, ни один из этих методов никогда не вызывается. Однако, если вы реализуете их в представлении и устанавливаете источник данных и делегируете себя, все это работает. Кто-нибудь знает, почему это происходит? Я устанавливаю переменные неправильно?
Если кто-то видел это раньше и имеет представление о том, что происходит неправильно, это было бы здорово.
Благодарю.
Речь идет о сильных ссылках. Вам нужно сохранить делегат и источник данных в переменной, потому что это weak
переменные самого представления picker. Контроллер представлений делает именно это.
Просто добавьте datasource и делегируйте переменные в контроллер представления, который управляет сборщиком.
См. Декларации в документации:
weak var delegate: UIPickerViewDelegate?
weak var dataSource: UIPickerViewDataSource?