【问题标题】:Troubles with UISearchBar \ UISearchDisplayViewControllerUISearchBar \ UISearchDisplayViewController 的问题
【发布时间】:2013-09-23 17:53:11
【问题描述】:

我在 iOS 7 上使用 SearchDisplayViewController 时遇到了困难。 我有一个隐藏在 UITableViewController 上的 searchBar,比如

self.tableView.tableHeaderView = searchBar;

问题是,当我点击 searchBar 输入内容时,视图开始变灰,我快速随机点按屏幕将其关闭,回到 tableView,searchBar 消失。完全。仅在 iOS 7 上。

调试一下,帧总是一样的:0,0,320,44。但是酒吧是看不见的!

也试过了

self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height);

当我快速操作时仍然会消失。

在 iOS 6 上它工作得很好。据我所知,问题仅出在 iOS 7 上。

不知道是什么情况,有没有人遇到和我一样的问题?

【问题讨论】:

  • 如果你指的是tableView,是的
  • 哎呀。 uitableviewcontroller 就在问题中,对不起。一般来说,搜索栏不会出现在 tableview 标题中。那就是问题所在。当搜索变为活动状态时,tablevc 中的 tableview 将变灰(我认为在任何操作系统版本中)。标题是表格视图的一部分。
  • 嗯,我明白了。我想做的是在导航控制器上隐藏搜索栏,所以当用户从那里向下滚动时,搜索栏就会出现,就像在邮件应用程序中一样。它只发生在 iOS 7 上,而且只有在它激活后我快速点击它时才会发生。在 iOS 6 上,即使快速完成它也能正常工作
  • 我遇到了同样的问题。您是否遇到与搜索栏相关的崩溃?即当它“不可见”时点击它
  • 不,没有任何问题。它只是..看不见

标签: objective-c uisearchbar ios7


【解决方案1】:

截至Double tap UISearchBar with search delegate on iOS 7 causes UISearchBar to disappear,我找到了实际可行的解决方法并解决了该错误 - 暂时。

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}

【讨论】:

  • 很好,谢谢。 iOS 7 出现了一个又一个重大的尴尬错误!
【解决方案2】:

我遇到了同样的问题,并注意到searchDisplayControllerDidEndSearch 被调用了两次。第一次self.searchDisplayController.searchBar的superview是UITableView,第二次还是UIView

有了接受的答案,我担心每次双击搜索栏时重新插入子视图会产生意想不到的后果或不必要的开销,而且我还担心它会在未来的 iOS 版本中中断.幸运的是,我们可以像这样利用 superview 的奇异性:

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    if (self.tableView != self.searchDisplayController.searchBar.superview) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}

如果我不得不猜测发生了什么,UISearchBar 在它处于活动状态时会自动创建一个临时的UIView 作为其父视图——这是执行搜索时看到的视图。当UISearchBar 被解除时,超级视图被设置回它之前的UITableView除非它被解除得太快以至于它从未正确初始化,在这种情况下它会清理不正确,UITableView 永远不会将UISearchBar 作为其子代。

这个解决方案仍然不理想,我认为 Apple 必须在自己的应用程序中做一些不同的事情,因为他们的搜索栏 UX 感觉更好一些。我认为在UISearchBar 准备好之前,最好不要先处理第二次点击。我尝试使用其他 UISearchBarDelegate 方法来执行此操作,但找不到合适的挂钩来覆盖当前行为。

【讨论】:

    【解决方案3】:

    我在 iOS 7 上遇到了同样的问题,我从苹果文档中解决了这个问题。大多数人犯的错误是他们将UISearchBar 变量与self.searchDisplayController.searchBar 关联为相同...!不,不..!他们是两种不同的东西!!! UISearchBar 应该被声明和初始化,然后包装成 self.searchDisplayController 作为 searchBar 然后再包装成 self.tableView.tableHeaderView 这样做不会消失!!!

    self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
    
    self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    
    self.searchDisplayController.delegate = self;
    
    self.searchDisplayController.searchResultsDataSource = self;
    
    self.searchDisplayController.searchResultsDelegate = self;
    
    [self.searchBar setPlaceholder:@"search the hell in me"];
    
    self.tableView.tableHeaderView = self.searchDisplayController.searchBar; 
    

    【讨论】:

    • 现在我只是想知道如何在 IB 中正确执行此操作(现在不迁移到情节提要)?
    【解决方案4】:

    @lehrblogger 解决方案的更精细方法:

    - (void)addSearchDisplayControllerBackToTableView {
        if ([self.searchDisplayController.searchBar isDescendantOfView:self.tableView] == NO) {
            NSLog(@"Search bar is not in current table view, will add it back");
            [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
            [self.searchDisplayController setActive:NO animated:YES];
        }
    }
    

    这种方法的原因:搜索时搜索栏被移动到搜索容器中,并且搜索栏的父视图始终是当前表视图以外的其他视图。

    注意:这将关闭搜索,因为用户在搜索栏上点击了多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2013-10-28
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多