Пользовательский класс Wrapper для UIDatePickerView на iPhone - PullRequest
1 голос
/ 10 ноября 2009

Я буду использовать DatePicker в нескольких местах в моем приложении. Я не хочу «загромождать» каждый viewController методами делегирования для UIPickerViewDelegate и UIPickerDatasource, плюс я буду делать одни и те же методы делегирования снова и снова.

Каждый раз, когда работает DatePicker, его единственная цель - сдвинуть половину экрана вверх, позволить пользователю выбрать дату, а затем снова исчезнуть. Я размышлял над оберткой viewController (DatePickerViewController), которая реализовала методы делегата datePicker, а затем выполнила NSNotification со значением, которое выбрал пользователь, что снова было перехвачено в viewController, создающем экземпляр DatePickerViewController. Это сделало бы меня отделенным datePicker и позволило бы viewController, создающему экземпляр datePicker, ничего не знает о DatePickerDelegate, но просто знал, что потенциально может прийти уведомление, содержащее NSDate. Мне кажется рациональным, как то, что я бы делал на других языках. Но, пожалуйста, поправьте меня, если я выкопаю себе дыру здесь :)

Когда я начал разбивать это, я столкнулся с некоторыми трудностями, я не очень опытен в Objective C и Какао. Я могу построить viewController, который в своем viewDidLoad представляет DatePicker, при запуске которого только это приведет к пустому белому экрану с datePicker в нижней половине экрана. Если я использую «presentModalViewController» из viewController, который создает экземпляр (пользовательского) DatePickerViewController, он, конечно, скользит вверх и покрывает весь экран. Я бы хотел, чтобы у пользователя оставалась видимая половина изображения. Очень похоже на настройку времени в событии в приложении iCal. (за исключением того, что они помещают новый viewController в стек). Ааа, только что понял, что я имею в виду то же самое, что клавиатура, когда она скользит и закрывает половину экрана.

Так что я думаю, что моя главная проблема: вы можете создать viewController, который ведет себя как клавиатура при добавлении в представление. Но сделайте все это в ViewController, который добавлен, а не в контроллере, создающем представление.

Надеюсь, это имеет смысл:)

Спасибо

1 Ответ

1 голос
/ 10 ноября 2009

(1) Поместите сборщик в виде модели (правка: должна быть модальной). Вот как реализована клавиатура.

(2) Контроллер / делегат сборщика должен управлять только видом модели и сборщиком.

(3) В делегате создайте два свойства, таких как:

id * target; Селектор выбора;

и такой метод, как:

- (void) sendPickerResultsTo: (id) theTarget forSelector: (SEl) theSelector;

(4) Перед отображением представления модели сборщика установите цель для вызывающего контроллера, а theSelector - для метода в вызывающем контроллере. Вы можете настроить метод выбора для передачи произвольного количества данных. Это будет выглядеть примерно так:

- (void) pickerResults: (NSArray *) pickerResults; // может передавать любое значение, если это объект

[Примечание: для такого рода вещей вы определяете протокол, если часто его используете]

(5) Если у вас есть значение выбора, просто вызовите делегат выбора:

[self.target executeSelector: theSelector withObject: anArrayOfPickerResults];

(5) Добавьте соответствующий метод к любому контроллеру, которому необходимо вызвать представление средства выбора модели, и установите контроллер в качестве цели перед отображением представления средства выбора модели.

Это даст вам автономное представление выбора модели, которое вы можете прикрепить к любому представлению и которое может отправлять свои результаты любому произвольному объекту, который реализует метод с правильной сигнатурой, т.е. реализует протокол.

Это, по сути, версия UIControls "сделай сам" addTarget: action: forControlEvents:

...