целевое действие - PullRequest
13 голосов
/ 13 марта 2010

Я, должно быть, здесь упускаю что-то очевидное, но ...

У UIControl есть метод

- (void)addTarget:(id)target action:(SEL)action forControlEvents: (UIControlEvents)controlEvents

, который позволяет добавить действие, которое будет вызываться при возникновении любого из заданных событий controlEvents. ControlEvents - это битовая маска событий, которые сообщают вам, касалось ли касание вниз, или вверх, или было перетащено и т. Д., Их около 16, вы или они вместе, и вам звонят, когда происходит любое из них.

Селектор может иметь одну из следующих подписей

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)

Никто из них не скажет вам, что такое битовая маска контрольного события. UIEvent - это что-то немного другое, оно связано с фактическим сенсорным событием и не содержит (я думаю) UIControlEvent. Отправитель (UIControl) также не может найти события управления.

Я хотел бы иметь один метод, который работает с несколькими управляющими событиями, так как у меня есть некоторый общий код, независимо от того, какое событие или события произошли, но мне все еще нужно знать, какие были UIControlEvents для некоторой конкретной обработки.

Мне не хватает способа узнать, какие UIControlEvents использовались при вызове действия, или мне действительно нужно разделить код на

-(void)actionWithUIControlEventX;
-(void)actionWithUIControlEventY;

Ответы [ 2 ]

5 голосов
/ 08 августа 2010

Я столкнулся с той же проблемой и нашел решение. Это не удивительно красиво, но работает довольно хорошо. Это категория UIControl, в которой хранится последнее событие UIControlEvent, запущенное в собственном свойстве тега. Вы можете получить его по ссылке ниже. Для дальнейшего ознакомления, вот документ из моей категории, для более подробного описания того, что происходит.

Надеюсь, это поможет! Приветствия / J

UIControl + CaptureUIControlEvents

git gist at: http://gist.github.com/513796

ПРОБЛЕМА: при стрельбе события UIControlEvents не передаются в целевое действие назначен на конкретное событие. Это было бы полезно для того, чтобы иметь только одно действие, которое переключается на основе запущенного UIControlEvent.

РЕШЕНИЕ: добавьте способ хранения UIControlEvent, запущенного в UIEvent.

ПРОБЛЕМА: Но мы не можем переопределить частные API, поэтому: (ХОРОШО) РЕШЕНИЕ: запустите UIControl для последнего запуска UIControlEvent.

Документация UIControl гласит:

Когда пользователь касается элемента управления способом, который соответствует одному или нескольким указанные события, UIControl отправляет себе sendActionsForControlEvents :. Это приводит к тому, что UIControl отправляет действие в UIApplication в sendAction: to: from: forEvent: message.

Можно подумать, что sendActionsForControlEvents: может быть переопределено (или подкласс) для хранения флага, но это не так. Кажется, что sendActionsForControlEvents: в основном для клиентов, чтобы инициировать события программно.

Вместо этого мне пришлось настроить схему, которая регистрирует действие для каждого элемента управления событие, которое каждый хочет отследить. Я решил не отслеживать все события (или в все UIControls) для производительности и простоты использования.

ПРИМЕР ИСПОЛЬЗОВАНИЯ:

При настройке UIControl:

UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];

И целевое действие:

- (void) touch:(UIControl *)sender {
  UIColor *color = [UIColor clearColor];
  switch (sender.tag) {
    case UIControlEventTouchDown: color = [UIColor redColor]; break;
    case UIControlEventTouchUpInside: color = [UIColor blueColor]; break;
    case UIControlEventTouchUpOutside: color = [UIColor redColor]; break;
  }
  sender.backgroundColor = color;
}
0 голосов
/ 21 апреля 2010

Когда вы создаете свой UIControl, установите значение для свойства тега. Затем в вашей функции действия вы можете определить тег UIControl, который вызвал его, используя [тег отправителя]. Вот пример:

-(void)viewDidLoad {
    UIButton *button1 = [[UIButton alloc] initWithFrame(CGRectMake(0.0,0.0,100.0,100.0)];
    button1.tag = 42;
    [button1 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];


    UIButton *button2 = [[UIButton alloc] initWithFrame(CGRectMake(100.0,0.0,100.0,100.0)];
    button2.tag = 43;
    [button2 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];

}
-(void)actionWithUIControlEvent:(id)sender {
     switch([sender tag]) {
     case 42:
         //Respond to button 1
         break;
     case 43:
         //Respond to button 2
         break;
     default:
         break;
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...