Правильный метод написания многократно используемых объектов интерфейса? - PullRequest
3 голосов
/ 26 января 2009

Я ищу правильный способ написания своих собственных объектов интерфейса.

Скажи, я хочу, чтобы изображение можно было дважды щелкнуть.

@interface DoubleTapButtonView : UIView {
    UILabel *text;
    UIImage *button;
    UIImage *button_selected;
    BOOL selected;
}
// detect tapCount == 2
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

Это работает нормально - кнопка получает события и может обнаруживать двойные нажатия.

Мой вопрос - как правильно обрабатывать действия? Я попробовал два подхода - добавить ссылки на родительский объект и делегирование.

Передача ссылки на родительский объект довольно проста ...

@interface DoubleTapButtonView : UIView {
    UILabel *text;
    UIImage *button;
    UIImage *button_selected;
    BOOL selected;
    MainViewController *parentView; // added
}

@property (nonatomic,retain) MainViewController *parentView; // added

// parentView would be assigned during init...
- (id)initWithFrame:(CGRect)frame 
     ViewController:(MainViewController *)aController;

- (id)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

Но это помешало бы легко добавить мой класс DoubleTapButtonView в другие представления и контроллеры представлений.

Делегирование добавляет некоторую дополнительную абстракцию к коду, но позволяет мне использовать DoubleTapButtonView в любом классе, который соответствует интерфейсу делегата.

@interface DoubleTapButtonView : UIView {
    UILabel *text;
    UIImage *button;
    UIImage *button_selected;
    BOOL selected;
  id <DoubleTapViewDelegate> delegate;
}

@property (nonatomic,assign) id <DoubleTapViewDelegate> delegate;

@protocol DoubleTapViewDelegate <NSObject>

@required
- (void)doubleTapReceived:(DoubleTapView *)target;

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

Мне интересно, есть ли другие способы думать об этой проблеме? Я заметил, что UIButton использует UIController и addTarget: для управления отправкой событий. Желательно ли использовать эту систему при написании собственных объектов интерфейса?

Обновление. Другой метод - использование NSNotificationCenter для создания наблюдателей для различных событий, а затем для создания события в кнопке.

// listen for the event in the parent object (viewController, etc)
[[NSNotificationCenter defaultCenter] 
  addObserver:self selector:@selector(DoubleTapped:) 
  name:@"DoubleTapNotification" object:nil];

// in DoubleTapButton, fire off a notification...
[[NSNotificationCenter defaultCenter] 
  postNotificationName:@"DoubleTapNotification" object:self];

Каковы недостатки этого подхода? Меньше проверки во время компиляции и потенциальный код спагетти с событиями, летающими за пределами структуры объекта? (и даже столкновение пространства имен, если два разработчика используют одно и то же имя события?)

Ответы [ 2 ]

2 голосов
/ 26 января 2009

Делегат - определенно способ пойти сюда.

1 голос
/ 26 января 2009

Или подкласс UIControl и использовать -sendActionsForControlEvents:. Основным преимуществом этого является несколько целей для конкретных действий ... в этом случае, конечно, у вас есть только двойное нажатие, но я думаю, что это лучший способ пойти в целом.

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