Подтвердить что ты не робот

Целевые действия uicontrolevents

Мне нужно пропустить что-то очевидное здесь, но...

UIControl имеет метод

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

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

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

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

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

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

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

-(void)actionWithUIControlEventX;
-(void)actionWithUIControlEventY;
4b9b3361

Ответ 1

Я столкнулся с той же проблемой и придумал решение. Это не удивительно красиво, но работает неплохо. Это категория 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: сообщение.

Можно подумать, что 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;
}

Ответ 2

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

-(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;
     }
 }