0

たくさんのUIButtonを入手しましたが、そのうちのいくつかは状況に応じて色を変更する必要があり、現在は次のように処理されています。

UIButton *button;
button = [self.view viewWithTag:positionInArray];
[button setBackgroundColor:[UIColor cyanColor]];
button = [self.view viewWithTag:positionInArray-1];
[button setBackgroundColor:[UIColor cyanColor]];
button = [self.view viewWithTag:positionInArray+3];
[button setBackgroundColor:[UIColor cyanColor]]
button = [self.view viewWithTag:positionInArray+4];
[button setBackgroundColor:[UIColor cyanColor]];

動作しますが、ボタンをタグに設定するコードは次の警告をスローします。

"タイプ'UIView*'の式で'UIButton*__strong'を初期化する互換性のないポインター型"

これを正しく行うにはどうすればよいですか?

4

4 に答える 4

1

問題は、viewWithTag:UIViewの任意のサブクラスを返す可能性があることです。UIButtonが返されることがわかっている場合は、次のようにキャストできます。

button = (UIButton *)[self.view viewWithTag:positionInArray];

これにより警告が非表示になりますが、ビューがボタンでない場合は予期しない結果が生じる可能性があります。より良い解決策は、返されたUIViewサブクラスがUIButtonであるかどうかを確認することです。

UIView *view = [self.view viewWithTag:positionInArray];
if ([view isKindOfClass:[UIButton class]]) {
   button = (UIButton *)view;
   [button setBackgroundColor:[UIColor cyanColor]];
} else {
   NSLog(@"Ooops, something went wrong! View is not a kind of UIButton.");
}
于 2012-12-27T14:27:18.790 に答える
1

問題は、を含む任意のサブクラスである可能性がviewWithTag:あるため、を返すことです。UIViewUIViewUIButton

これはデザインに依存します。このタグを持つサブビューが他にない場合は、他の回答と同じように結果をUIButtonにキャストして、それで済ませてください:)

于 2012-12-27T14:27:51.467 に答える
0

UIViewを次のようにUIButtonにキャストする必要があります。

button = (UIButton *)[self.view viewWithTag:positionInArray];

ただし、次のような操作を行って、ビューが実際にボタンであることを確認することをお勧めします。

UIView *button = [self.view viewWithTag:positionInArray];
if ([button isKindOfClass[UIButton class]] {
    [button setBackgroundColor:[UIColor cyanColor]]; 
}

この例では、UIViewにもこのメソッドがあるため、UIButtonにカーストする必要はありません。UIButtonの色のみを変更したい場合は、ifステートメントが必要になります。

于 2012-12-27T14:25:47.140 に答える
0

ダウンキャスティングの代替

viewWithTag:UIViewを返しますが、UIViewオブジェクトのサブクラスを指している場合があります。
ポリモーフィズムは有効であり、メッセージングは​​動的であるため、次のようにすることができます。

UIView *button;
button = [self.view viewWithTag:positionInArray];
[button setBackgroundColor:[UIColor cyanColor]];

UIViewからbackgroundColorを継承しているので、問題ありません。
ただし、タイプIDはいつでも使用できます。これは、一種の「陽気な」ものです。

于 2012-12-27T14:37:53.783 に答える