2

アプリケーションに UISearchBar を実装しました。プログラムで作成し、View Controller(テーブルビューではありません)で使用しています。それは完全に正常に動作しますが、私が抱えている問題は、ジェスチャ認識機能を使用してキーボードを閉じることです。ユーザーがキーボードの外側の画面をタップすると、キーボードが閉じられるようにします。

この問題を解決するための解決策がたくさんあることは知っていますが、現時点では理解できないかなりユニークな問題があります。これを実装するために次のコードを使用しました。

ViewController の viewDidLoad メソッド内にこの行を配置しました。

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:search action:@selector(resignFirstResponder)]];

このメソッドは正常に機能しますが、ビュー コントローラーはビューをモーダルに表示するため、次の構造になっています。

ViewController - モーダル -> view2 -モーダル - > view3

ビュー 2 と 3 を閉じて ViewController に戻ると、ジェスチャ認識機能が機能しなくなります。私が見つけた別の解決策を試すとき、私は同じ問題を抱えています:

UIGestureRecognizer* cancelGesture;

- (void) backgroundTouched:(id)sender {
    [self.view endEditing:YES];
}

#pragma mark - UISearchBarDelegate

-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {
    cancelGesture = [UITapGestureRecognizer new];
    [cancelGesture addTarget:self action:@selector(backgroundTouched:)];
    [self.view addGestureRecognizer:cancelGesture];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)search {
    if (cancelGesture) {
        [self.view removeGestureRecognizer:cancelGesture];
    }
}

これらをメインのViewControllerに追加しましたが、最初はうまくいきましたが、モーダルビューから戻った後、ジェスチャーが機能しなくなりました。

助けていただければ幸いです。

編集1:

そのため、テスト中に、キーボードの検索ボタンを押すと同様の効果が得られることがわかりました。検索が押されたら、次のコードを使用してキーボードを閉じます。

- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
    [search resignFirstResponder];
}

ここでも同じ効果があり、最初にアプリを起動して検索を行うと正常に動作しますが、モーダルに表示されたビュー コントローラーからこの画面に戻った後、Enter キーを押してもキーボードが消えなくなりました。

編集2:

searchBarSearchButtonClicked デリゲート メソッドにこのコードを追加してみました。

- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
    if ([search isFirstResponder]) {
        [search resignFirstResponder];
        NSLog(@"text field was first responder");
    } else {
        [search becomeFirstResponder];
        [search resignFirstResponder];
        NSLog(@"text field was not first responder");
    }
}

どちらの場合も、テキスト フィールドがファーストレスポンダであることが出力されます。モーダル ビューから戻って検索バーをもう一度クリックした後も、最初のレスポンダーであると表示されますが、非常に奇妙に無視されません。これについての洞察は非常に役に立ちます、ありがとう。

4

2 に答える 2

0

ジェスチャを追加および削除する代わりに-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {-(void)searchBarTextDidEndEditing:(UISearchBar *)search {viewDidDisappear viewWillAppear' (add here) and'(ここで削除)で実行します。

cancelGestureそして、あなたが属性を持つプロパティであると仮定しますretain。ジェスチャーを追加している間、代わりにこれを行います

UITapGestureRecognizer *gesture = [UITapGestureRecognizer new];
[gesture addTarget:self action:@selector(backgroundTouched:)];
self.cancelGesture = gesture;
[self.view addGestureRecognizer:self.cancelGesture];

cancelGestureでリリースすることを忘れないでくださいdealloc

于 2013-02-13T13:03:13.970 に答える