2012-01-22 17 views
1

にすべてのUITextFieldやUITextViewのデリゲートを設定します。それは上記のコード内のコメントで見ることができ、エラーを取得しかし は、プログラム私は​​でこのコードを持っている自己

for(UIView *subview in self.view.subviews) 
{ 
    if([subview isKindOfClass: [UITextView class]] || [subview isKindOfClass: [UITextField class]]) 
    { 
     // error: property 'delegate' not found on object of type 'UIView *' 
     subview.delegate = (id) self; 
    } 
} 

私はUIViewにデリゲートプロパティがないことを知っていますが、私はUIViewがUITextFieldまたはUITextViewのいずれかであり、これらの両方にデリゲートプロパティがあることを知っています。

これを修正するにはどうすればよいですか?

答えて

4

あなたは、テキストビューまたはテキストフィールドに現在のUIViewをキャストすることができ

スプリット2にチェックあなたはそれをキャストするためにどのような種類を知っています。これを行うもう1つの方法は、オブジェクトがセレクタsetDelegateに応答するかどうかを調べ、そうであればsetDelegateメッセージをそのオブジェクトに送信することです。

だから、このような何か:最後の一つを

for(UIView *subview in self.view.subviews) 
{ 
    if([subview isKindOfClass: [UITextView class]]) 
    { 
     ((UITextView*)subview).delegate = (id) self; 
    } 

    if([subview isKindOfClass: [UITextField class]]) 
    { 
     ((UITextField*)subview).delegate = (id) self; 
    } 
} 

それとも...

if ([subview respondsToSelector:@selector(setDelegate)]) 
{ 
    [subview performSelector:@selector(setDelegate:) withObject:self]; 
} 

、それはより少ないコードだが、あなたはすべてのためのすべてのデリゲートのコールバックを実装することを確認する必要がありますビューに配置するUIViewオブジェクト。

+0

'tv'を' subview'に置き換えてください。 – Tyilo

+0

テストをしてくれてありがとう。更新しました。 – bryanmac

+0

サブビューの複数のクラスに送る必要があり、セレクタ( '@selector(setEnabled)')に 'BOOL'パラメータを送る必要がある場合は、これを行う簡単な方法がありますか? 'nil'または' [NSNumber numberWithBool:NO] 'を送信しても有効に設定されますか?私はそれぞれのタイプをチェックしてキャストする必要はありませんか? – Tyilo

関連する問題