2012-07-25 5 views
0

Скажем, у меня есть следующий код:Может ли UIControlEvents в iOS быть OR'd вместе?

[somevalue_field 
    addTarget:self 
    action:@selector(somevalue_fieldDidChange:) 
    forControlEvents:UIControlEventEditingDidEnd | UIControlEventTouchDragExit | 
        UIControlEVentTouchDragOutside ]; 

Будет побитовое ORing этих UIControlEvents фактически работают вместе в плане объединения их последствий, так что если один из этих событий произойдет, метод в селекторе будет стрелять?

Или это может привести к тому, что слишком много бит будут нанизаны друг на друга, чтобы поместиться в одно целое?

ответ

5

Да, вы можете или флаги управления событиями вместе.

Я думаю, вы можете быть немного смущены о том, как работает побитовое ИЛИ. ORing не увеличивает количество бит, а увеличивает количество установленных бит.

Когда вы видите флаги определены следующим образом:

UIControlEventTouchDragOutside = 1 << 3, 
UIControlEventTouchDragExit  = 1 << 5, 
UIControlEventEditingDidEnd  = 1 << 18, 

это часто признак того, что она предназначалась они могли быть ORed вместе.

В бинарное эти флаги и результат OR будет:

 
UIControlEventTouchDragOutside 00000000000000000000000000001000 
UIControlEventTouchDragExit 00000000000000000000000000100000 
UIControlEventEditingDidEnd 00000000000001000000000000000000 

Result of OR     00000000000001000000000000101000 

Так как вы можете видеть, количество битов в результате все та же (32) это просто число набора бит, который изменяется.

Google "двоичная арифметика" и "побитовые булевы операторы" для получения дополнительной информации об этом.

Последнее замечание, Яблоко docs for addTarget:action:forControlEvents сказать:

controlEvents битовой маска, определяет событие управления, для которого отправляется сообщение действия. См. «Контрольные события» для битовых масок.

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