1

私はスタンフォードコースの課題を行っており、彼はこのコード UIControlStateSelected|UIControlStateDisabled を投稿しました。オペランドは?

また、このコードを使用してボタンに値を設定しようとしていますが、うまくいきません。

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

2 に答える 2

3

ボタンには、列挙値として表される多くの状態があります。ここにあるのはそのうちの 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 つのビットが設定されています。したがって、上記のバイナリ表現は次のとおりです。

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

ご覧のとおり、<<はシフト演算子であり、単純にビットを左にシフトしているので、これらの列挙を 1 つの変数にまとめることができます! どういう意味ですか?ここ:

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

そのため、通常はビットごとの OR 演算子を使用してこれらのフラグを結合します。

0000 0001 | 0000 0010 = 0000 0011

最後に、これらのフラグを組み合わせてメソッドに送信してタイトルを設定すると、1 回のメソッド呼び出しでこれら 2 つのオプションのタイトルを変更するように基になる実装に指示することになります。

...

動作しないコードに関する 2 番目の質問については、「動作しない」とはどういう意味かを説明していただけると助かります。クラッシュしますか?あなたが探している望ましい出力は何ですか?


編集:

コメントを読んだところですが、この回答でカバーする必要がある問題がさらにいくつかあるようです。

ボタンの状態を実用的に変更するには、次のように呼び出す必要があります。

[sender setEnabled:NO];

あなたが持っているコードは、ボタンが無効な状態に変わった後にそのテキストを表示するようにボタンに指示します。

演算子に関する別の問題は、||確かに OR 演算であり、ビットごとの OR ではありません。この演算子は、ビット単位の演算の代わりにブール式に使用されます。

于 2013-06-09T09:51:28.737 に答える