Как реализовать панель поиска, которая всегда остается на вершине, используя UISearchDisplayController в iPhone SDK 3.0
-
06-07-2019 - |
Вопрос
В 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 пользовательского размера...
Большое спасибо за любую помощь!!
Решение
У меня нет решения на макушке головы, но я скажу, что беспокойство, которое у вас возникло, сводится к минимуму из-за того, что пользователь может просто коснуться верхней части экрана и увеличить масштаб таблицы до верха. (чтобы изменить условия поиска, если это не так).
Другие советы
Мое общее решение для размещения битов на странице, которые я не хочу прокручивать, состоит в том, чтобы иметь UITableView внутри другого представления. Это внешнее представление содержит две вещи: полосу в верхней части и таблицу чуть короче полной страницы под ней.
@интерфейс:
UISearchDisplayController < UISearchBarDelegate > *searchDisplayController;
@реализация:
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar: searchBar contentsController: self];
searchDisplayController.delegate = self;
searchBar.delegate = searchDisplayController;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;
Поместите этот код в свой TableViewController:
self.tableView.frame = CGRectMake(0,searchDisplayController?.searchBar.bounds.size.height,320,480);