Как реализовать панель поиска, которая всегда будет наверху, с помощью UISearchDisplayController в iPhone SDK 3.0

В 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 результатов поиска, которая скрыта за моей панелью поиска.

Есть ли способ навсегда изменить размер UITableView моего UITableViewController, чтобы он запускался прямо под панелью поиска?

И есть еще одна проблема: каждый раз, когда я касаюсь панели поиска, UISearchDisplayController автоматически скрывает панель навигации и изменяет размер UITableView (он расширяется вверх), поэтому я думаю, что на этом этапе UISearchDisplayController будет иметь большую проблему с моим TableView нестандартного размера. ...

Большое спасибо за любую помощь !!


person xoconoxtle    schedule 31.07.2009    source источник


Ответы (4)


У меня нет решения, которое приходит мне в голову, но я скажу, что беспокойство, которое у вас возникает, сводится к минимуму благодаря возможности для пользователя просто коснуться верхней части экрана и увеличить масштаб таблицы вверх (чтобы изменить условия поиска, если это неправильно).

person Kendall Helmstetter Gelner    schedule 31.07.2009
comment
спасибо за Ваш ответ! тем временем я понял, что при вводе поискового запроса UISearchDisplayController автоматически блокирует местоположение панели поиска и изменяет размер представления таблицы результатов ... так что это почти именно то, чего я хотел достичь ... - person xoconoxtle; 01.08.2009

Мое общее решение для того, чтобы на странице были биты, которые я не хочу прокручивать, - это иметь UITableView внутри другого представления. Это внешнее представление содержит две вещи - панель вверху и таблицу чуть короче полной страницы под ней.

person Amagrammer    schedule 31.07.2009

@интерфейс:

UISearchDisplayController < UISearchBarDelegate > *searchDisplayController;

@выполнение:

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

searchDisplayController.delegate = self;
searchBar.delegate = searchDisplayController;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;
person Community    schedule 26.08.2009

Поместите этот код в свой TableViewController:

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