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 по какой-то причине, даже если установлен только делегат. Если кто-то знает больше, было бы интересно узнать, почему это происходит.

Другие вопросы по тегам