2012-04-12 15 views
5

私はUIScrollViewの中にテキストフィールドがあり、ユーザーが編集を開始するときにクリアボタンを表示したい。また、ユーザーがUIScrollview(テキストフィールドではない)の背景をタップするときにキーボードを非表示にする必要があります。そのクリアボタンを表示することは問題ではないが、クリアボタンがタップされるとキーボードが隠れてしまい、テキストフィールドがクリアされないという問題がある。クリアボタンがクリックされたとき(ただし、テキストフィールドがタップされているときには起動されません)、これを処理するメソッドが起動されるため、明らかにジェスチャ認識機能が問題になります。ここに私のコード:UITextfieldのクリアボタンは、キーボードが内部にあるときにキーボードを隠す。

//adding gesture recognizer so i can hide keyboard when user taps scrollview 
    - (void) textFieldDidBeginEditing:(UITextField *)textField 
    { 
     if (self.tapOutside == nil) self.tapOutside = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textFieldTouchOutSide:)]; 

     [self.scrollView addGestureRecognizer:self.tapOutside]; 
    } 

    //This hides keyboard BUT IS ALSO CALLED WHEN CLEAR BUTTON IS TAPPED 
    - (void)textFieldTouchOutSide:(id)sender 
    { 
     [self.textfield resignFirstResponder]; 
    } 

    //NEVER GETS CALLED 
    - (BOOL) textFieldShouldClear:(UITextField *)textField { 
     return YES; 
    } 

どのようにこれを解決するためのアイデア?ジェスチャー認識機能を追加する方が良いでしょうか?私は同じ問題を抱えていたし、次のメソッドを実装し、それを解決... ...ないエレガントなソリューションの

答えて

13

をたくさん事前に感謝を考えることはできません。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    // Disallow recognition of gestures in unwanted elements 
    if ([touch.view isMemberOfClass:[UIButton class]]) { // The "clear text" icon is a UIButton 
     return NO; 
    } 
    return YES; 
} 

が合致することを忘れないでください「UIGestureRecognizerDelegate」プロトコルへと(自分のVARSを使用して)デリゲートを設定:

self.tapOutside.delegate = self; 

乾杯

+0

カントは来週までテストしますが、これは解決策のようです...ありがとうございます! :) –

+0

あなたはそれを試しましたか?それは動作しましたか?もしそうなら、この回答を受け入れてください。 – Thompsonian

+0

私はカスタムUIButtonサブクラスをページにも持っていましたので、私はそれをisKindOfClassにしました:[UIButtonクラス] –

2

しかしヨーヨーならば、私はこの問題を持っていたし、この溶液に働いていたがボタンがのサブビューであれば

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
// Disallow recognition of gestures in unwanted elements 
if ([touch.view isMemberOfClass:[UIButton class]] && [touch.view.superview isMemberOfClass:[UITextField class]]) { 

    // The "clear text" icon is a UIButton 
    return NO; 
} 
return YES; 
} 

これだけノーリターンにケースを絞り込むます:Uはあなたが次の操作を行うことができますフォームに記入しながら、ユーザーがタップすることができますビュー上の他のボタンを持っていますクリアボタンの場合と同じようにUITextFieldを返しますが、通常はジェスチャーコードを実行する通常のボタンにタッチするとキーボードを非表示にします。

関連する問題