导航栏中的UISearchBar

54

如何在导航栏中显示UISearchBar?

我不知道如何实现。

非常感谢您的帮助。

5个回答

86
将搜索栏放置于导航栏的中央:
self.navigationItem.titleView = self.searchBarTop;
将搜索栏放置在导航栏的左侧或右侧:
UIBarButtonItem *searchBarItem = [[UIBarButtonItem alloc] initWithCustomView:searchBar];
self.navigationItem.rightBarButtonItem = searchBarItem;

1
我遇到了一个问题,就是在iPad上,结果显示在一个嵌入式的弹出窗口中的表格视图中,而不是原始表格视图的框架中。有什么解决办法吗? - Norbert
2
如果我这样设置,searchDisplayController 就不再显示了。cellForRowAtIndexPath: 方法也不会被调用。使用 searchDisplayController.displaysSearchBarInNavigationBar 可以解决问题,但是我不能使用它,因为我还要支持 iOS 6... - jdev
1
这种方法隐藏了标题。 - Panos
self.navigationItem.titleView = searchBar 如果你想让它居中,这个方法可以实现。 - Saurav

20
截至iOS 7,UISearchDisplayController已默认支持此功能。将UISearchDisplayController的displaysSearchBarInNavigationBar = YES设置为轻松实现此功能。
根据文档:
自iOS 7.0开始,您可以通过配置搜索显示控制器的displaysSearchBarInNavigationBar和navigationItem属性,使用带导航栏(UINavigationBar类的实例)的搜索显示控制器。

根据苹果的文档,似乎我们无法在titleView中设置searchBar。我是对的吗?您能向我们展示如何设置searchDisplayController的navigationItem吗?谢谢。 - NLemay
6
我尝试过这个,但我的搜索栏在屏幕中间! - Van Du Tran
5
使用Storyboards时,最简单的方法是将搜索栏和搜索显示控制器从“实用工具”区域拖到文档大纲内当前场景的底部。然后在viewdidload中添加self.searchDisplayController.displaysSearchBarInNavigationBar = YES;。您可能希望在编辑时显示取消按钮或隐藏返回按钮,因此可以在委托实现中完成这个操作。 - Bohrnsen
8
这会使搜索栏占据整个导航栏,隐藏任何已存在的左侧或右侧按钮。我该怎么保留它们? - fishinear
@fishinear,请查看我刚刚发布的答案,了解如何将searchdisplaycontroller添加到导航栏中,同时保留左/右侧栏按钮项。 - djibouti33
@VanDuTran 当我将搜索栏分配给表视图标题时,我遇到了这个问题,当我删除它后,我又遇到了另一个问题——搜索结果表视图仅在第一次搜索时显示。 - Shmidt

12

正如一位评论者所指出的那样,使用searchDisplayController.displaysSearchBarInNavigationBar = true会导致隐藏任何现有的左/右栏按钮项。

我发现了两种不同的方法来添加一个searchBar到iOS7的新属性searchDisplayController中的navigationBar

1)Nib方法

如果你使用一个.xib文件,你可以为这个值设置一个用户定义的运行时属性,由于某些原因,leftBarButtonItem仍然保持不变。我没有测试过rightBarButtonItem。

enter image description here

2)代码(时间很重要)

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

- (void)viewDidLoad
{
    ...
    self.searchDisplayController.displaysSearchBarInNavigationBar = true;
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem new];
    ...
}

1
我在Storyboard中尝试了(1),但它崩溃了。这个类不符合键值编码的要求,因为它缺少displaysSearchBarInNavigationBar这个关键字。 - Van Du Tran
你可以在StoryBoard中完成这个操作,但是你需要将其设置在Search Display Controller上,而不是View Controller上;然而,在我的测试中它并不能保留正确的右侧按钮项,但它确实将搜索栏放在了导航栏中。 - Peter
1
您可以在 StoryBoard 中设置引用输出的 UIBarButtonItems 上使用 #2。不要使用上面的 [UIBarButtonItem new],而是使用以下代码:self.navigationItem.leftBarButtonItem = self.leftButton(其中 self.leftButton 是左侧按钮的输出)。 - Peter
3
看起来自 iOS 8.0 开始,SearchDisplayController 就已被弃用了。 - fatuhoku
Ray Weinerlich在这方面有一个很好的教程 http://www.raywenderlich.com/113772/uisearchcontroller-tutorial - Grimxn

11

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


1
这些样例帮了我很多,非常感谢! - Okhan Okbay
1
我在 iOS 上休息了几年,错过了很多 UIKit 的更新。这真的很有帮助。苹果真的需要更好地组织他们的文档。我已经花费了无数个小时观看 WWDC 视频/示例,搜索文档存档,但我从未见过这个。感谢您的分享。 - hidden-username
1
也许我错过了什么,但最新版本似乎只包含两个示例,即默认和自定义,其中没有在导航栏中 :( - Ric Santos

2

在NavigationBar中使用UISearchBar的Objective C代码片段

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

Read more here


它仍可在iOS 12上运行。这是Objective-C开发人员的干净解决方案 :) - Diego Jiménez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接