Как построить пользовательский элемент управления в UIKIt? - PullRequest
3 голосов
/ 05 апреля 2009

Мой подкласс UIView обрабатывает события касания и обновляет внутренние значения, когда касания начинаются и когда происходит отслеживание.

Контроллер моего вида загружает этот пользовательский вид на экран. Каков наилучший способ настроить контроллер представления для прослушивания изменений значений моего пользовательского элемента управления?

1 Ответ

8 голосов
/ 05 апреля 2009

Вы можете:

  1. Реализуйте методы делегата в вашем контроллере и вызывайте их из вашего представления, или
  2. Подкласс UIControl вместо этого и отправьте UIControlEvent s на ваш контроллер

когда значения изменяются (точнее, когда пользователь взаимодействует с вашим элементом управления).

Если ваше представление используется для получения какой-либо формы ввода от пользователя, тогда подкласс UIControl является лучшим подходом.

Из справочной библиотеки iPhone:

UIControl - это базовый класс для элементов управления: такие объекты, как кнопки и ползунки, которые используются для передачи намерений пользователя приложению.

Таким образом, самое важное различие между UIView и UIControl заключается в том, передано или нет намерение пользователя. UIView предназначен для отображения информации, а UIControl предназначен для сбора пользовательского ввода.

UPDATE:

Если вы решите использовать шаблон делегата, вот как может выглядеть ваш код:

В интерфейсе вашего пользовательского представления определите делегата следующим образом:

@interface MyView : UIView {
    id delegate;
}
@property (assign) id delegate;
@end

и @synthesize это в реализации.

В вашем контроллере представления установите контроллер в качестве делегата:

MyView myView = [[MyView alloc] init];
[myView setDelegate:self];

Затем, когда пользователь взаимодействует с представлением (например, в touchesBegan), возможно, изменяя значения, делайте это в представлении:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // Possibly change the values
    if([delegate respondsToSelector:@selector(valuesChanged)]) {
        [delegate valuesChanged];
    }
}

Возможно, вы также захотите взглянуть на Делегаты и источники данных в Руководстве по основам какао.

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