5

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

    //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;
    }

これを解決する方法はありますか?ジェスチャ認識エンジンを追加するより良い方法でしょうか? エレガントな解決策は考えられません...よろしくお願いします...

4

2 に答える 2

3

私はちょうどこの問題を抱えていて、この解決策は機能しましたが、ユーザーがフォームに入力するときにタップできるビューに他のボタンがある場合は、次のことができます。

-(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;
}

これにより、クリアボタンの場合のように、ボタンがUITextFieldのサブビューである場合にのみ「いいえ」が返されるようにケースが絞り込まれますが、通常はジェスチャコードを実行する通常のボタンに触れた場合はキーボードが非表示になります。

于 2012-05-18T15:29:06.340 に答える