如何使用iPhone SDK 3.0中的UISearchDisplayController实现始终位于顶部的搜索栏

时间:2009-07-31 17:04:56

标签: iphone iphone-sdk-3.0 uisearchbar searchdisplaycontroller

iPhone SDK 3.0有一个方便的新类“UISearchDisplayController”,可以轻松创建搜索栏,处理所有用户输入并显示搜索结果。

我正在将它用于我的新应用,但有一件事我想改变:

默认情况下,搜索栏应放在显示搜索结果的UITableView的顶部。因此,当向下滚动结果列表时,搜索栏会消失。

我想要实现的是让搜索栏始终位于顶部,当滚动TableView时,搜索栏应该保持原样。 (原因是:在我的应用程序中,有时会有很多搜索结果,所以有时用户必须向下滚动一段时间,当他意识到他必须更改搜索字符串时,我不想强​​迫他一直滚动回来)

我已经做的是将搜索栏添加到UINavigationController的视图中,该视图是我的表视图的“父视图”,而不是直接将其添加到表视图中:

MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];

searchBar = [[UISearchBar alloc] init];
searchBar.delegate = self;

[searchBar sizeToFit];
CGFloat searchBarHeight = [searchBar frame].size.height;
CGRect mainViewBounds = delegate.navController.view.bounds;
[searchBar setFrame:CGRectMake(CGRectGetMinX(mainViewBounds),
                             CGRectGetMinY(mainViewBounds) + 20,
                             CGRectGetWidth(mainViewBounds),
                             searchBarHeight)];
searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;

[delegate.navController.view addSubview: searchBar];

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar: searchBar contentsController: self];
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;

...但是我的问题是,表格视图位于搜索栏的后面,并且搜索结果中始终存在第一个隐藏在搜索栏后面的TableViewCell。

有没有办法永久调整我的UITableViewController的UITableView,以便它在搜索栏下面启动?

还有另外一个问题:每当我触摸搜索栏时,UISearchDisplayController会自动隐藏导航栏并调整UITableView的大小(它会扩展到顶部),所以我认为此时UISearchDisplayController对我来说会有很大的问题自定义大小的TableView ...

非常感谢您的帮助!!

4 个答案:

答案 0 :(得分:2)

我没有一个解决方案 - 但我会说用户只需点击屏幕顶部并将表格缩放到顶部就可以最大限度地减少您的担忧(如果错误,请更改搜索字词。)

答案 1 :(得分:1)

我在页面上有一些我不想滚动的位的一般解决方案是将UITableView 放在另一个视图中。该外观包含两件事 - 顶部有一个条形,下面有一个比整页略短的页面。

答案 2 :(得分:0)

@interface:

UISearchDisplayController < UISearchBarDelegate > *searchDisplayController;

@implementation:

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar: searchBar contentsController: self];

searchDisplayController.delegate = self;
searchBar.delegate = searchDisplayController;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;

答案 3 :(得分:0)

将此代码放在TableViewController中:

self.tableView.frame = CGRectMake(0,searchDisplayController?.searchBar.bounds.size.height,320,480);