2013-08-25 2 views
0

У меня есть приложение, которое пользователи используют для записи своих измерений тела. В настоящее время он использует UIPickerView, но я хочу написать настраиваемый элемент управления, который больше похож на рулетку (плоскую, не-skeu!).Динамический подкласс для управления в раскадровке

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

Я также хочу использовать конструктор интерфейса, если это возможно.

Так что я хочу, чтобы построить что-то вроде этого:

UML

, а затем в IB я выбираю класс верхнего уровня. В viewDidLoad я хочу выбрать тип подкласса для загрузки.

Interface Builder

Мой вопрос на самом деле, я принимаю неправильное направление здесь? По мере того как я начал реализовывать это, я понял, что элементы управления инициализируются с помощью awakeFromNib до того, как будет обработано viewDidLoad.

Каков наилучший способ добиться того, что мне нужно? Или я слишком упрощаю? Каков самый простой подход, который пойдет в направлении, в котором я хочу идти?

ответ

0

Я думаю, что это хороший способ достичь такого поведения использует шаблон стратегии, как описано в here

Вы можете иметь только один подкласс: HorizontalSlider с strategy собственности и несколько вспомогательных классов, чтобы делать реальные вещи.

+0

Спасибо @ Raúl, который выглядит как хороший подход. Есть ли способ передать значение времени выполнения из контроллера представления в HorizontalSlider до вызова awakeFromNib? В противном случае мне придется добавить некоторые дополнительные зависимости в HorizontalSlider. – Lewis42

+0

Фактически передача сообщений между объектами до 'awakeFromNib' не рекомендуется, поскольку порядок, в котором объекты создаются, не гарантируется. Вы можете прочитать больше об этом в справочной системе 'awakeFromNib'. Возможно, вы могли бы реализовать пользовательский метод initWithCoder: 'или' init' в 'HorizontalSilder', чтобы делать то, что вы хотите? Только один вызывается перед 'awakeFromNib' (если класс соответствует протоколу' NSCoding', вызывается 'initWithCoder:', в противном случае используется метод 'init') –

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