2011-10-20 6 views
0

私が持っている:objective-cでメッセージを送信するときにキャストできますか?

" 'UIViewのは、' '-setTitle:' に応答しないこと" という警告をトリガさ
[[[[self navigationItem] leftBarButtonItem] customView] setTitle:@" Create "]; 

。私は試しました:

[[[[self navigationItem] leftBarButtonItem] (UIButton*)customView] setTitle:@" Create "]; 

これを行うとエラーが発生します。 0(id)でキャストしようとしましたが、どちらもうまくいきませんでした。私はおそらくちょうどUIButtonにcustomViewを格納し、そこから行くことができる知っているが、これのようなメッセージ内でキャストすることが可能かどうか疑問に思う?

+2

これらのケースでは、コンパイラを信じるのは面白いです。 UIViewは実際には-setTitleに応答しません: – sidyll

答えて

5

キャスティングについて考えてみましょう。この行のこの

[(UIButton*)[[[self navigationItem] leftBarButtonItem] customView] setTitle:@" Create "]; 

違いを試してみて、自分のラインを使用すると、プロパティ(例えばcustomView)のではなく、あなたがメソッドを呼び出ししようとしていたに返されたオブジェクトをキャストしてはならないということです。

0

前述のように、customViewの具体的なクラスを確認するか、インスタンスがrespondsToSelectorかどうかを確認することをお勧めします。そうでなければ、何らかの理由で特定のビューが変更されるとクラッシュする可能性があります。 そうでなければ、この種の入れ子のドット表記法(これらはすべて実際にはプロパティです)を使用すると、コードをもっと読みやすくなります。

関連する問題