2016-02-17 3 views
2

У меня есть пользовательский подкласс UIControl с обратным вызовом метода действия. Я хочу отобразить значение элемента управления на UILabel во время его настройки, а затем я хочу, чтобы метка стала скрытой, когда пользователь перестает регулировать элемент управления.Определить, какой тип события вызвал действие UIControl

Поэтому, я подключил действие как для UIControlEventValueChanged, так и для UIControlEventTouchUpInside. Оба метода успешно активируют мой метод действий. Однако, чтобы делать разные вещи в этом методе на основе действия, мне нужно знать, какое событие вызвало этот метод. Как я могу это сделать? Я просмотрел UIControl и не вижу очевидного свойства. state, похоже, возвращается 1 для обоих действий.

Так что-то вроде этого:

- (void)handleSlider1:(CustomSlider*)sender { 

     if (sender.state == UIControlEventValueChanged) { 
      // code 
     } else { 
      // different code 
     } 
    } 

ответ

0

Если вы хотите использовать один и тот же метод, чтобы обрабатывать оба события, то вы можете проверить выделено свойства управления:

if (sender.highlighted) { 
    // slider is changing value (value changed) 
} else { 
    // slider has stopped changing value (touch up inside) 
} 

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

+0

Это не то, что я спросил. вопрос заключался в том, как определить, какие действия были отправлены. –

+0

Насколько я могу использовать один обратный вызов для нескольких 'UIControl', я просто использую' .tag' = 1,2,3,4 ... –

1

Вы можете легко различить два события, соединяя их друг с другом, чтобы отделить IBAction. Каждое новое действие затем назовет вашего одиночного обработчика, передав соответствующее значение UIControlEvent:

- (IBAction)sliderValueChanged:(CustomSlider *)slider 
{ 
    [self handleSlider1:slider forEvent:UIControlEventValueChanged]; 
} 

- (IBAction)sliderValueChanged:(CustomSlider *)slider 
{ 
    [self handleSlider1:slider forEvent:UIControlEventTouchUpInside]; 
} 

- (void)handleSlider1:(CustomSlider *)sender forEvent:(UIControlEvents)event 
{ 
    if (event == UIControlEventValueChanged) 
    //... 
} 
+0

Я не уверен, почему вы думаете, что мне нужен «IBAction». Я не использую никаких функций IB. Просто код. То, что я сделал, это отправить действие 'UIControlEventTouchCancel' в мой метод' endTrackingWithTouch: 'подпроцесса' UIControl'. Вдобавок к этому (и добавляя к сложности), я установил главное значение моего элемента '-1' в качестве контрольной точки для моего контроллера viewController, что это действие было' UIControlEventTouchCancel'. Причина «-1» заключается именно в том, что, когда событие управления запускает метод действия, он не отправляет информацию, чтобы определить, какое событие управления было. –

+0

Вы можете использовать эту технику независимо от того, являются ли они IBActions. –

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