导航栏中的 UISearchBar

Posted

技术标签:

【中文标题】导航栏中的 UISearchBar【英文标题】:UISearchBar in navigationbar 【发布时间】:2011-02-23 18:40:02 【问题描述】:

如何在 NavigationBar 中显示 UISearchBar?

我不知道该怎么做。

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

将searchBar放到navigationBar的中心:

self.navigationItem.titleView = self.searchBarTop;

将 searchBar 放在 navigationBar 的左侧/右侧:

UIBarButtonItem *searchBarItem = [[UIBarButtonItem alloc] initWithCustomView:searchBar];
self.navigationItem.rightBarButtonItem = searchBarItem;

【讨论】:

我的问题是,在 iPad 上,结果显示在嵌入弹出框的表格视图中,而不是在原始表格视图的框架中。有什么解决办法吗? 如果我这样设置,searchDisplayController 就不会再出现了。 cellForRowAtIndexPath: 方法也没有被调用。使用searchDisplayController.displaysSearchBarInNavigationBar 有效,但我无法使用它,因为我也支持 ios 6... 这种方法隐藏了标题 self.navigationItem.titleView = searchBar 如果你想把它放在中心,这可行【参考方案2】:

从 iOS 7 开始,UISearchDisplayController 默认支持此功能。设置 UISearchDisplayController 的 displaysSearchBarInNavigationBar = YES 以使其轻松工作。

根据文档:

从 iOS 7.0 开始,您可以通过配置搜索显示控制器的 displaySearchBarInNavigationBar 和 navigationItem 属性来使用带有导航栏(UINavigationBar 类的实例)的搜索显示控制器。

【讨论】:

根据 Apple 的文档,看起来我们无法在 titleView 中设置 searchBar。我对吗?你能告诉我们你是如何设置 searchDisplayController 的 navigationItem 的吗?谢谢 我试过了,但我的搜索栏在屏幕中间! 使用 Storyboards 时最简单的方法是将搜索栏和搜索显示控制器从实用程序区域拖到 Document Outline 内当前场景的底部。之后只需在 viewdidload 中添加self.searchDisplayController.displaysSearchBarInNavigationBar = YES;。您可能希望在编辑时显示取消按钮或隐藏后退按钮,以便可以在委托实现中完成。 这使得搜索栏占据整个导航栏,隐藏所有现有的左栏和右栏按钮。我怎么还能保留这些? @fishinear,查看我刚刚发布的关于如何在导航中添加搜索显示控制器同时保持左/右栏按钮项的答案。【参考方案3】:

正如一位评论者所说,使用 searchDisplayController.displaysSearchBarInNavigationBar = true 最终会隐藏任何现有的左/右栏按钮项目。

我发现了两种使用 iOS7 在searchDisplayController 上的新属性将searchBar 添加到navigationBar 的不同方法。

1) 基于笔尖的方法

如果您使用的是 .xib,则可以为此值设置用户定义的运行时属性,无论出于何种原因,leftBarButtonItem 都会保持不变。我没有用 rightBarButtonItem 测试过。

2) 代码(时间很重要)

如果您想在代码中实现,时间似乎很重要。看来您必须先将searchBar 添加到navigationBar,然后再设置您的barButtonItem

- (void)viewDidLoad

    ...
    self.searchDisplayController.displaysSearchBarInNavigationBar = true;
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem new];
    ...

【讨论】:

我在情节提要中尝试了 (1),但它崩溃了。此类对于键显示SearchBarInNavigationBar 的键值编码不兼容。' 可以在 StoryBoard 中进行,但需要在 Search Display Controller 上设置,而不是在 View Controller 上;但是,它并没有在我的测试中保留右键项目,但它确实将搜索栏放在导航栏中。 您可以在具有引用插座的 StoryBoard 中将 #2 与 UIBarButtonItems 设置一起使用。而不是上面的 [UIBarButtonItem new]:self.navigationItem.leftBarButtonItem = self.leftButton(其中 self.leftButton 是左按钮的出口)。 似乎 SearchDisplayController 自 iOS 8.0 以来已被弃用。 Ray Weinerlich 有一个很好的教程raywenderlich.com/113772/uisearchcontroller-tutorial【参考方案4】:

查看 Apple 的 UICatalog 示例代码。它展示了如何以三种不同的方式使用新的UISearchController:模态、导航栏和导航栏下方。

【讨论】:

这些样本对我帮助很大。谢谢! 我在 iOS 上休息了几年,错过了很多 UIKit 更新。这很有帮助。 Apple 确实需要更好地组织他们的文档。我花了无数个小时浏览 WWDC 视频/示例,搜索文档档案,但我从未见过这个。感谢分享 也许我错过了,但似乎最新版本只包含两个示例,默认和自定义,导航栏中都没有:(【参考方案5】:

导航栏中 UISearchBar 的 Objective C 代码 sn-p

- (void)viewDidLoad 
    UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    
    if (@available(iOS 11.0, *)) 
        self.navigationItem.searchController = searchController;
     else 
        self.navigationItem.titleView = searchController.searchBar;
    

阅读更多here

【讨论】:

它仍在 iOS 12 上运行。Objective-C 开发人员的干净解决方案 :)

以上是关于导航栏中的 UISearchBar的主要内容,如果未能解决你的问题,请参考以下文章

导航栏中的下拉按钮会扭曲导航栏

导航栏中的 iOS 搜索栏

带有 ionic-2-sidemenu 应用程序的顶部导航栏中的导航按钮

如何使导航栏中的组件居中[重复]

text 导航栏中的切换按钮没有collaspe导航

导航栏中的 Swift 自定义后退按钮