iOS UIPickerView вызывает numberOfRowsInComponent, даже если UIPickerViewDataSource не привязан
Привет, этот вопрос только для любопытства.
У меня есть UIPickerView в моем контроллере, делегат связан с IB и реализован в контроллере, а также один из методов UIPickerViewDataSource реализован в контроллере numberOfRowsInComponent. Этот метод вызывается даже dataSource не привязан и реализован полностью. Интересно, как это возможно? Одна из моих мыслей заключается в том, что этот метод вызывается из фона неявно... Мой код;
class ViewController: UIViewController, UIPickerViewDelegate {
let titles = ["item 1", "item 2", "item 3", "item 4", "item 5"]
override func viewDidLoad() {
super.viewDidLoad()
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return titles.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return titles[row]
}
2 ответа
Как вы упомянули в своем комментарии, что вы установили delegate
/ datasource
от storyboard
, то его эквивалент pickerView.delegate = self
/ pickerView.datasource = self
,
Вы можете назначить delegate
а также datasource
либо путем кодирования или раскадровки. Так что в вашем случае вы сделали это из storyboard
так что это на самом деле связано с вашим pickerView
,
Это удивительно, давайте назовем это особенность. У меня нет большого опыта работы с Obj-C, поэтому не знаю, как и почему это происходит.
У меня также есть UIPickerView в некотором представлении, которое имеет установленный делегат ТОЛЬКО, и методы dataSource вызываются, хотя источник данных выбора является нулевым во время выполнения. Когда я изменяю вывод Swift 3 @objc на Default или no из настроек сборки, то правильно методы не вызываются, так как dataSource равен nil, и у меня пустой выбор. Я не знаю, когда это было добавлено в Xcode, но, очевидно, после выхода Swift3.
Поэтому я считаю, что в реализации Obj-C есть некоторая внутренняя логика, которая почему-то вызывает методы dataSource по какой-то причине, даже если установлен только делегат. Если кто-то знает больше, было бы интересно узнать, почему это происходит.