【问题标题】:How to use UISearchDisplayController from a controller within an UITabBar controller?如何从 UITabBar 控制器中的控制器使用 UISearchDisplayController?
【发布时间】:2010-11-18 11:13:20
【问题描述】:
我有一个管理多个控制器的 UITabBar 控制器(使用 SDK 3.0)。其中之一是 tableView 控制器,我需要使用 UISearchDisplayController 提供搜索功能。我的所有代码都基于 Apple TableSearch 示例。但是,当单击选项卡时,tableView 控制器出现显示其相关内容,但没有出现 searchBar。我已经检查了 IB 中的 xib 以确保所有的网点都设置正确,但无论我尝试什么 self.searchDisplayController 总是 nil 并且搜索栏没有出现。
实际上,我从 TableSearch 示例中复制了 MainView.xib,并将文件的所有者类设置为选项卡的正确控制器类。插座的设置与示例 MainView.xib 中的一样。我是否错过了任何重要的步骤或做错了什么?
提前谢谢你。
【问题讨论】:
标签:
iphone
uisearchbar
uisearchdisplaycontroller
【解决方案1】:
我遇到了同样的问题,偶然发现了这个解决方案......
如果您使用 Interface Builder 将表格视图控制器(例如 UISearchDisplayController)嵌套在选项卡栏或导航控制器中,则需要在“属性检查器”窗口中设置“Nib 名称”。
Nib 名称将是保存表格视图并以控制器(例如UISearchDisplayController)作为文件所有者的名称。
【解决方案2】:
我也有这个问题 :( 搜索栏是否隐藏在 tableview 后面?
@unforgiven,
你试过这个吗...?
searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 40)];
[self.tableView setTableHeaderView: searchBar];
这会手动创建一个搜索栏并且可以正常工作。但是我在 IB 中犯了一些愚蠢的错误,即使我的连接是完美的,SearchBar 也没有出现。 :-(
如果你得到答案,请更新这篇文章...
【解决方案3】:
好的,我找到了解决方法。在我的情况下,问题是由于我使用嵌入在 UITabBarController 中的控制器作为其托管选项卡之一(即作为孩子)。
从 UITabBarController 中删除控制器,然后将 UINavigationController 添加到 UITabBarController,最后将我的控制器作为 UINavigationController 的子级完全解决了这个问题。
我不明白为什么会这样(文档中没有相关信息,这经常发生);然而,它现在就像一个魅力。
亲切的问候。
【讨论】:
-
这在 2017 年 11 月仍然有效。有一个很好的图表显示了如何将 UINavigationController 添加到标签页here。
【解决方案4】:
我有类似的问题
为了解决问题,我必须对不可原谅的答案再采取一步
在我的主要笔尖
1) 创建一个 UITabController
2)然后我将一个 UINavigational 控制器拖到选项卡控制器中
3)然后拖出一个 UITableViewController 到 NavigationalController 作为一个孩子
4) 然后在检查器中将 (3) 类更改为我的 MyTableWithSearchBarViewController - 检查笔尖名称是否正确,并在必要时在检查器中更改它
5)然后我不得不删除由IB在步骤(3)中自动创建的tableView。只有这样,搜索栏才会正确显示...
如果在第 3 步中我将另一个控制器拖到舞台上或将 tableView 留在那里,它只会显示表格而不显示搜索栏
奇怪
【解决方案5】:
如果您的 nib 文件包含 UITableViewController,Tomtrapeze 就有正确的答案。但是,如果您在代码中加载 UITableViewController——例如将其推送到 UINavigationController 的堆栈中——解决方案会有所不同。
在初始化 UITableViewController 或子类时,你需要使用 -initWithNibName:bundle: 形式的初始化器并指定你的 nib 文件的名称。或者,您可以使用标准 -initWithStyle: 初始化程序并在加载视图之前手动设置 nibName 属性。
如果在加载视图时未设置 nibName 属性,UITableViewController 将不会使用正常的 UIViewController nib 查找逻辑。它只会加载一个标准的 UITableView。
【解决方案6】:
我最近了解到,当 NIB 文件与类同名(即 MyViewController.xib)时,我可以使用 [[MyViewController alloc] initWithNibName:nil bundle:nil]; 加载 NIB 文件。事实证明,以这种方式初始化会导致“UISearchBarandUISearchBarDisplayController”不显示。当我通过实际输入类的名称来初始化视图控制器时,我的搜索栏正确显示。我最初认为这与我呈现视图控制器的方式有关,但很高兴事实并非如此。
PGWSearchViewController *searchVC = [[PGWSearchViewController alloc] initWithNibName:@"PGWSearchViewController" bundle:nil];
searchVC.modalPresentationStyle = UIModalPresentationFullScreen;
searchVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:searchVC animated:YES completion:^{ }];
这是使用 iOS SDK 5.1 和 XCode 4.3.1。
【解决方案7】:
对我有用的另一个可能的解决方法是使用 initWithNibName:bundle: 初始化 UITableViewController:
SearchEntryTableViewController* searchEntryTableViewController = [[SearchEntryTableViewController alloc]initWithNibName:@"SearchEntryTableViewController" bundle:nil];
在将 UITableViewController 放入 UITabBarController 之前将其嵌套在 UINavigationController 中并不能解决我的问题...