【问题标题】:UISearchDisplayController: Cancel as dismiss buttonUISearchDisplayController:取消作为关闭按钮
【发布时间】:2012-07-10 12:31:53
【问题描述】:

UISearchDisplayController 有这个问题。我想在专用视图中使用它来处理搜索。对于我的控制器类,我使用了搜索栏、搜索控制器和表格视图控制器的组合。 SearchViewController 链接到.xib

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

只要出现SearchViewController,搜索栏就会成为第一响应者,因此搜索处于活动状态。一切看起来和工作正常,有一个例外: 为了回到之前的视图,我想使用 SearchBar 的取消按钮。现在问题来了:如果用户在没有进行搜索的情况下触摸底层 tableview 的灰色区域,取消按钮(因此是返回的唯一方法)消失。

这是我试图解决的问题:

  1. showsCancelButton = YESsearchDisplayControllerDidEndSearch。可以,但生成的 UI 丑得要命:取消按钮转出然后重新出现。
  2. UITapGestureRecognizer 添加到searchcontroller 的searchResultTableView 中,希望能抓住机会。不起作用,它仍然可以通过。
  3. 子类UISearchBar 并覆盖self.searchController.searchBar setShowsCancelButton: - 不起作用。

如何解决这个问题的想法:

  1. 始终隐藏取消按钮,而是添加自定义按钮。问题:您知道如何做到这一点以使 UI 看起来不错吗?我最关心的是处理所有情况,以便搜索文本字段始终很好地保持在按钮的一侧。
  2. 放弃UISearchDisplayController 以获得更灵活的解决方案。你知道去哪里看吗?在 iOS 3 之前,这个控制器不存在,对吧?是否有解决方案仍然有效?

很高兴收到您的任何意见。提前致谢。

【问题讨论】:

  • 你试过showsCancelButton = YESsearchDisplayControllerWillEndSearch吗?
  • 是的,没有效果。隐藏取消按钮的事件必须在willEndSearchdidEndSearch 之间触发。

标签: ios cocoa-touch uikit uisearchdisplaycontroller


【解决方案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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多