Делегаты и источники данных не работают с UIPickerViewDelegate

0

Я пытаюсь реализовать отдельный источник данных и делегат для 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()
    }



}

Однако мой источник данных и делегат никогда не используются, а сборщик пуст, ни один из этих методов никогда не вызывается. Однако, если вы реализуете их в представлении и устанавливаете источник данных и делегируете себя, все это работает. Кто-нибудь знает, почему это происходит? Я устанавливаю переменные неправильно?

Если кто-то видел это раньше и имеет представление о том, что происходит неправильно, это было бы здорово.

Благодарю.

Теги:
delegates
protocols

1 ответ

1

Речь идет о сильных ссылках. Вам нужно сохранить делегат и источник данных в переменной, потому что это weak переменные самого представления picker. Контроллер представлений делает именно это.

Просто добавьте datasource и делегируйте переменные в контроллер представления, который управляет сборщиком.

См. Декларации в документации:

weak var delegate: UIPickerViewDelegate?
weak var dataSource: UIPickerViewDataSource?
  • 0
    Я немного запутался ... Где я должен установить их с объектами LocationPickerViewDelegate и LocationPickerViewDataSource?
  • 0
    Я добавил их в свой LocationViewController с UIPickerView там: @IBOutlet слабый var LocationPicker: LocationPickerView! слабый делегат var: UIPickerViewDelegate? слабый var dataSource: UIPickerViewDataSource? self.delegate = LocationPickerViewDelegate () self.dataSource = LocationPickerViewDataSource () в LocationPickerView, но все равно не работает
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню