2016-04-18 3 views
0

Я нахожу действительно странным или плохое дизайнерское решение, что UIPickerViewDelegate содержит методы, которые должны быть осведомлены о его данных (заголовок). Поскольку это было бы всей целью его DataSource. Как это:UIPickerView DataSource x Делегат-дизайн

pickerView(_:titleForRow:forComponent:) 
pickerView(_:attributedTitleForRow:forComponent:) 
pickerView(_:viewForRow:forComponent:reusingView:) 

Я хочу реализовать PickerView с различными объектами для DataSource и Delegate. Конечно, было бы легко создать нового делегата, возможно, назовите его PickerViewListenerDelegate. Но поскольку яблоко разработало это дизайнерское решение, я подумал, что это стоит обсудить в первую очередь.

В чем смысл этого странного дизайнерского решения? Я что-то упустил?

ответ

0

Протокол UIPickerViewDataSource адресует только прямые свойства источника данных, то есть количество компонентов и количество строк в каждом из них.

Протокол UIPickerViewDelegate адресует презентацию. Он предоставляет размеры, заголовки или представления, а также обратный вызов для выбора.

Если сравнивать, то с UITableViewDataSource и UITableViewDelegate, картина странно отличается.

Достаточно часто и delegate, и dataSource подключаются к одному и тому же объекту, то есть к контроллеру вида, который направляет вызовы базовой модели и создает необходимые элементы пользовательского интерфейса. И лично, я думаю, что проводка dataSource для модели данных, но делегат к контроллеру - делает странное решение, которое может легко сломать инкапсуляцию.

Таким образом, в основном это означает: да, здесь вы можете разделить между моделью и презентацией (т. Е. Форматер), используя данный шаблон. Если вы сочтете это полезным, зависит от вас.

+0

Как и в случае с табличными представлениями, я часто использую тот же объект контроллера, что и DataSource и Delegate. Однако, как я вижу, у них есть два разных свойства по какой-то причине, и в этот раз для моего проекта было бы целесообразно использовать два разных объекта, однако странный дизайн 'UIPickerViewDataSource' и' UIPickerViewDelegate' мешает мне делая это. (Мне нужно было бы связать их странными способами, чтобы «делегат» знал заголовки. –

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