UIControlStateSelected|UIControlStateDisabled, Объяснение цели C

Я выполняю задания по курсам в Стэнфорде, и он опубликовал этот код UIControlStateSelected|UIControlStateDisabled, что именно это означает и что означает | операнд делать?

Кроме того, я пытаюсь установить значение кнопки, используя этот код, но это не сработает, какая-либо помощь?

if(!sender.isSelected){
        [sender setTitle:self.deck.drawRandomCard.contents forState:UIControlStateSelected];
    } else {
        [sender setTitle:@"" forState:UIControlStateDisabled];
    }

person user2076774    schedule 09.06.2013    source источник
comment
Objective-C — это надмножество C. Оператор | — это побитовый оператор or из C. Выполните быстрый поиск, чтобы увидеть, что он делает.   -  person rmaddy    schedule 09.06.2013


Ответы (2)


Кнопки имеют множество состояний, представленных в виде значений перечисления. У вас есть только два из них:

UIControlStateSelected|UIControlStateDisabled

Весь список в UIControl.h:

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,      // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,      // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,  // additional flags available for application use
    UIControlStateReserved     = 0xFF000000   // flags reserved for internal framework use
};

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

1 << 0 = 0000 0001 b
1 << 1 = 0000 0010 b
.. and so on

Как видите, << — это оператор сдвига, и мы просто сдвигаем биты влево, чтобы можно было объединить эти перечисления вместе в одну переменную! Что я имею в виду? Здесь:

0000 0011 b // This is essentially two flags set, on for the highlighted state one for the disabled

Итак, мы обычно используем побитовый оператор ИЛИ для объединения этих флагов:

0000 0001 | 0000 0010 = 0000 0011

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

...

Что касается вашего второго вопроса о коде, который не работает, было бы полезно объяснить, что значит «не работает». Это крах? Каков желаемый результат, который вы ищете?


Изменить:

Я только что прочитал комментарии, и кажется, что этот ответ должен охватить еще несколько вопросов:

Чтобы прагматично изменить состояние кнопки, вы должны вызвать что-то вроде:

[sender setEnabled:NO];

Код, который у вас есть, просто говорит кнопке отображать этот текст ПОСЛЕ того, как он изменился на отключенное состояние.

Еще одна проблема, связанная с оператором ||, который, безусловно, является операцией ИЛИ, но не побитовым ИЛИ. Этот оператор используется для логических выражений вместо побитовых операций.

person Mazyod    schedule 09.06.2013

Что значит | означает (для случая состояний UIButton)?

Это означает применение атрибута, когда кнопка выбрана и отключена одновременно.

Насколько я понимаю, оператор | означает побитовое ИЛИ. Но каким-то образом, когда вы выполняете побитовое ИЛИ UIControlState вместе, они должны выполняться одновременно, чтобы эффект имел место. Да, это странно, но так оно и сейчас, судя по моему опыту.

Взгляните на другой ответ здесь, который показывает, что он также ведет себя так, как я сказал: UIButton setTitle:forState: question

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

Теперь о том, что ваш код не работает:

Ваш код просто устанавливает заголовок кнопки, когда кнопка выбрана (или отключена для блока else), но это не означает, что он сделает кнопку выбранной (или отключенной).

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

Эти свойства, такие как «включено», «выбрано», «выделено», могут быть активированы прикосновением пальца, или вы также можете установить эти свойства программно. Взгляните на ссылка на класс UIControl, который включает перечисленные свойства.

Например:

myButton.enabled = NO;
myButton.highlighted = YES;
myButton.selected = YES;
person Valent Richie    schedule 09.06.2013
comment
Оператор | является побитовым или оператором. Это не значит одновременно. - person rmaddy; 09.06.2013
comment
@rmaddy. Спасибо. Обновил мой ответ. - person Valent Richie; 09.06.2013
comment
Как сделать, чтобы свойство кнопки было выбрано или отключено? Я думал, что он будет выбран, если я нажму на него в представлении, когда приложение запущено? Также не будет || быть и операнд ИЛИ или это существует только для C? - person user2076774; 09.06.2013
comment
@ user2076774 | является побитовым ИЛИ, но кажется ошибкой для состояния UIButton. В ответе, найденном здесь, также указано следующее: > а также исходя из собственного опыта кодирования. Вы можете попробовать запустить код самостоятельно. - person Valent Richie; 09.06.2013
comment
@rmaddy Это побитовый или оператор, но он означает одновременно. По крайней мере, для UIButton. - person ooops; 05.01.2018