3

私はこの問題を抱えていUISearchDisplayControllerます。検索を処理するための専用ビューで使用したい。私のコントローラ クラスでは、検索バー、検索コントローラ、およびテーブルビュー コントローラの構成を使用しました。SearchViewController は にリンクされてい.xibます。

@interface SearchViewController : UIViewController <UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource> {
  NSSet *words;
  UISearchDisplayController *searchController;
  UISearchBar *searchBar;
  PhraseTableViewController *phraseTableViewController;
}

表示されるとすぐSearchViewControllerに、検索バーがファーストレスポンダーになり、検索がアクティブになります。1 つの例外を除いて、すべてが正常に動作 するように見えます。前のビューに戻るには、SearchBar のキャンセル ボタンを使用したいと考えています。ここで問題が発生します。検索が行われていないときにユーザーが下にあるテーブルビューの灰色の領域に触れると、キャンセル ボタン (したがって、元に戻る唯一の方法) が消えます。

これを解決するために私が試みたのは次のとおりです。

  1. showsCancelButton = YESオンsearchDisplayControllerDidEndSearch。動作しますが、結果として得られる UI は地獄のように醜いものです。キャンセル ボタンが遷移してから再び表示されます。
  2. タップをキャッチすることを期待してUITapGestureRecognizer、searchcontrollerに a を追加します。searchResultTableViewうまくいきません、まだ続きます。
  3. サブクラスUISearchBarとオーバーライドself.searchController.searchBar setShowsCancelButton:- 機能しませんでした。

これを解決する方法のアイデア:

  1. 常にキャンセル ボタンを非表示にし、代わりにカスタム ボタンを追加します。質問: UI の見栄えを良くする方法を知っていますか? 私が最も懸念しているのは、検索テキストフィールドが常にボタンの横にうまく収まるように、すべてのケースを処理することです。
  2. UISearchDisplayControllerより柔軟なソリューションのために、すべてを一緒に捨ててください。どこを見ればいいかわかりますか?iOS 3 以前には、このコントローラーは存在しませんでしたよね? まだ機能する解決策はありませんか?

ご意見をお寄せいただければ幸いです。前もって感謝します。

4

1 に答える 1

1

ユーザーが戻るボタンを取得できるように、適切な種類のイベントのナビゲーションバーを再表示するだけです。以下の関連コードを参照してください。ただし、イベント処理の一部はUISearchDisplayController、ナビゲーション バーが間違ったタイミングで再表示される他の「特別な」動作の解決策の一部であることを付け加える必要があります (詳細ページにジャンプする前に、醜いアニメーション)。

編集:そして、はい、私はそれが醜いことを知っています-しかし、あなたが私に尋ねれば、そのいまいましいUISearchDisplayControllerもそうです。

static BOOL _cancelBtnClicked = NO;
static BOOL _phraseClicked = NO;

- (void)searchBarCancelButtonClicked:(UISearchBar *)_searchBar{ 
  if(self.searchController.active){
    _cancelBtnClicked = YES;
  }else{
    [self back];
  }
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{
  if(_cancelBtnClicked){
    _cancelBtnClicked = NO;
    [self back];
  }
  else if (!_phraseClicked) {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
  }
}

- (void)keyboardWillHide:(NSNotification *)notification {
  if (_phraseClicked) {
    _phraseClicked = NO;
  }
  else if(self.isViewLoaded && self.view.window != nil) {
    self.navigationController.navigationBar.hidden = YES;
  }
}

- (void)hideNavbarAndKeepHidden {        
  self.navigationController.navigationBar.hidden = YES;
  [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];   
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  _phraseClicked = YES;
  [self.phraseTableViewController tableView:tableView didSelectRowAtIndexPath:indexPath];
}
于 2012-07-10T13:23:29.763 に答える