2017-01-02 1 views
0

Привет, этот вопрос касается только любопытства.iOS UIPickerView вызывает числоOfRowsInComponent даже 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] 
} 
+0

Установили ли вы делегат для просмотра сборщика из раскадровки ?? –

+0

да, в моем построителе интерфейса, этот код работает кстати, мой вопрос в том, как numberOfRowsInComponent назвал даже его протокол не реализованным – Eren

ответ

0

Как вы уже упомянули в своем комментарии, что вы установили delegate/datasource от storyboard, то его эквивалентной pickerView.delegate = self/pickerView.datasource = self.

Вы можете назначить delegate и datasource либо кодирования или раскадровки. Так что в вашем случае вы сделали это с storyboard, поэтому его фактически связали с вашим pickerView.

+0

Хорошо, я установил делегат из раскадровки, но я не установил dataSource ни кодом, ни раскадрой. Метод numberOfRowsInComponent - это метод dataSource, поэтому мой вопрос заключается в том, как этот метод называется даже я ничего не делал с dataSource – Eren

+0

У вас есть более одного pickerViews ?? Проверьте, не скопировали ли вы копии, которые уже установили делегат и источник данных. –

+0

Нет, у меня есть только один выбор – Eren

0

Это одно замечательное, назовем его особенностью. У меня нет фона Obj-C, поэтому не знаю, как и почему это происходит.

У меня также есть UIPickerView в некотором представлении, в котором есть только делегированные делегаты, и методы dataSource называются, хотя источник данных сборщика равен нулю во время выполнения. Когда я меняю Swift 3 @objc inference по умолчанию или нет из настроек сборки, то правильно методы не называются, поскольку dataSource - это нуль, и у меня есть пустой сборщик. Я не знаю, когда это было добавлено в Xcode, но, очевидно, после выхода Swift3.

Поэтому я считаю, что существует некоторая внутренняя логика реализации Obj-C, которая почему-то вызывает методы dataSource по какой-либо причине, даже если установлен только делегат. Если кто-то знает больше, было бы интересно узнать, почему это происходит.

Смежные вопросы