关于ios:UISearchDisplayController:取消为关闭按钮

UISearchDisplayController: Cancel as dismiss button

我在UISearchDisplayController上遇到此问题。我想在专用视图中使用它来处理搜索。对于我的控制器类,我使用了搜索栏,searchcontroller和tableviewcontroller的组合。 SearchViewController链接到.xib

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

SearchViewController出现后,搜索栏将成为第一响应者,因此搜索处于活动状态。一切看起来都正常,但有一个例外:
为了返回上一个视图,我想使用SearchBar的"取消"按钮。现在出现了问题:如果在未进行搜索的情况下用户触摸了基础表视图的灰色区域,则取消按钮(因此是唯一的取回方法)消失了。

这是我尝试解决的问题:

  • searchDisplayControllerDidEndSearch上的showsCancelButton = YES。可以,但是最终的用户界面却很难看:取消按钮会过渡出来,然后重新出现。
  • 在搜索控制器的searchResultTableView中添加UITapGestureRecognizer,以期抓住水龙头。不起作用,仍然可以通过。
  • 子类UISearchBar并覆盖self.searchController.searchBar setShowsCancelButton:-无效。
  • 想法如何解决此问题:

  • 始终隐藏取消按钮,而是添加自定义按钮。问题:您是否有一个想法,如何使UI看起来不错?我最关心的是处理所有情况,以使search-textfield始终很好地保持在按钮的侧面。
  • 沟渠UISearchDisplayController一起使用,可提供更灵活的解决方案。你知道去哪里看吗?在iOS 3之前的版本中,该控制器不存在,对吧?围绕该解决方案的解决方案仍然有效吗?
  • 我很高兴收到您的任何意见。预先感谢。


    好吧,我想我找到了一种可行的方法:我只是取消隐藏导航栏以显示正确的事件,以便用户获得后退按钮。请参阅下面的相关代码,但是我必须补充一点,某些事件处理是UISearchDisplayController其他"特殊"行为的解决方案的一部分,这些行为会使导航栏在错误的时间重新出现(在跳转到详细信息页面之前,该操作会也导致丑陋的动画)。

    编辑:是的,我知道它很丑-但是,如果您问我,那该死的UISearchDisplayController也是如此。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    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];
    }