2010-12-02 13 views
9

プロパティとしてUIViewを持つクラスがあります。時には私はUILabelを渡します。時にはUITextField。私が渡すかどうかに関わらず、クラスにテキストを設定させたい。現在、私は働く、これをやっています:UIViewの警告を停止する方法は、セレクタに応答しない可能性があります

if ([self.viewToUpdate respondsToSelector:@selector(setText:)] && !self.newAnswer) 
    [self.viewToUpdate setText:[[self.choices objectAtIndex:indexPath.row] text]]; 

問題がある、私はrespondsToSelectorをチェックしてるにもかかわらず、Xcodeのは私のUIViewがsetText:に反応することを知らないので、これは、警告を与えます。この警告を削除するにはどうすればよいですか?

TextFieldかLabelかどうかを確認してから、それぞれTextFieldまたはLabelにキャストすることができますが、これは苦痛になります。さらに多くの種類のビューがある場合は、私はそれぞれのコードのいくつかの行を追加する必要があります。

私は

答えて

16

だけでキャストしてみてください...私自身のプロトコルを作成する方法について考え、その後、私のクラスを持つことviewToUpdateの型としてのIDを持っている...もちろんのUITextFieldとUILabelは、そのプロトコルに準拠していますそれはIDとして:

if ([self.viewToUpdate respondsToSelector:@selector(setText:)] && !self.newAnswer) 
    [(id)self.viewToUpdate setText:[[self.choices objectAtIndex:indexPath.row] text]]; 
+0

ありがとう!私はそれを考えなかったとは信じられません。とても簡単! (ID)は、最初の行ではなく、2行目に置く必要があります。 – GendoIkari

+0

よろしくお願いします。ちょうど変更を加えました。 –

+0

オブジェクトをテストして、それが期待どおりのクラスであることを確認してから、その特定のクラスにキャストし、直接idにキャストする方がよいでしょう。 self.viewToUpdateがこれまでとは異なるクラスであった場合、少なくともクラッシュを避けることができます。私がrespondsToSelectorをテストしているので、 – Ryan

関連する問題