UISearchDisplayController без просмотра таблицы результатов?
-
06-07-2019 - |
Вопрос
Обычно UISearchDisplayController при активации затемняет отображение таблицы и фокусирует панель поиска.Как только вы вводите текст в панель поиска, он создает searchResultsTableView, который отображается между панелью поиска и клавиатурой.Делегат searchDisplayController вызывается, когда этот второй UITableView загружен / показан / скрыт / выгружен.Обычно он показывает результаты поиска в реальном времени или записи автозаполнения во время ввода текста.
В моем приложении я хочу выполнить поиск в веб-сервисе, и я не хочу вызывать веб-сервис для каждой буквы, которую вводит пользователь.Поэтому я хочу полностью отключить searchResultsTableView и сохранить затемненное черное наложение, пока он вводит текст.Затем я бы запустил поиск (с помощью экрана загрузки), как только он нажмет кнопку поиска.
Простой возврат нулевых строк для searchResultsTableView выглядит не очень хорошо, поскольку он отображает пустой searchResultsTableView с сообщением "нет результатов".Я попытался скрыть таблицу, когда она появится (searchDisplayController:didLoadSearchResultsTableView:
) что работает, но затемненное наложение также скрыто, так что базовый TableView снова полностью виден.
Есть какие-нибудь идеи, помимо воссоздания функциональности UISearchDisplayController с нуля?
Решение
вот маленький трюк, который я только что понял а также вы должны вернуть 0 результатов при редактировании строки поиска
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
savedSearchTerm = searchString;
[controller.searchResultsTableView setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.8]];
[controller.searchResultsTableView setRowHeight:800];
[controller.searchResultsTableView setScrollEnabled:NO];
return NO;
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
// undo the changes above to prevent artefacts reported below by mclin
}
я думаю, вы поймете, что делать дальше
Другие советы
Вы пробовали это:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(_lookup:) object:nil];
[self performSelector:@selector(_lookup:) withObject:txt afterDelay:0.20];
Таким образом, если пользователь вводит другой символ в течение 1 / 5сек, вы делаете только один веб-вызов.
В конце концов, ничего из вышеперечисленного не сработало, поэтому я придумал следующее (вы должны вызвать removeTableHeader, когда будете готовы отобразить результаты):
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
[self setTableHeader];
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
[self setTableHeader];
}
- (void)setTableHeader {
UIView *headerView = [[UIView alloc] initWithFrame:self.searchDisplayController.searchResultsTableView.frame];
headerView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];
[self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
[self.searchDisplayController.searchResultsTableView setScrollEnabled:NO];
[self.searchDisplayController.searchResultsTableView setTableHeaderView:headerView];
[headerView release];
}
- (void)removeTableHeader {
[self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
[self.searchDisplayController.searchResultsTableView setScrollEnabled:YES];
[self.searchDisplayController.searchResultsTableView setTableHeaderView:nil];
}
Очевидно, это делает таблицу прозрачной, добавляет черный / полупрозрачный заголовок таблицы того же размера, что и таблица, и отключает прокрутку таблицы, чтобы вы не могли подняться выше или выше заголовка. В качестве бонуса вы можете добавить что-нибудь в представление заголовка («пожалуйста, подождите ...» или индикатор активности).
У меня была та же проблема, что и у вас, я решил ее с помощью a) , установив альфа в searchResultsTableView на 0 в начале поиска, а затем b) добавив / удалив overlayView для представления viewController. Работает как шарм для меня.
@interface MyViewController()
//...
@property(nonatomic, retain) UIView *overlayView;
//...
@end
@implementation MyViewController
@synthesize overlayView = _overlayView;
//...
- (void)viewDidLoad
{
//...
//define your overlayView
_overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480)];
_overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.8];
}
//hide the searchResultsTableView
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
self.searchDisplayController.searchResultsTableView.alpha = 0.0f;
}
//when ending the search, hide the overlayView
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
[_overlayView removeFromSuperview];
}
//depending on what the user has inputed, add or remove the overlayView to the view of the current viewController
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString length]>0)
{
[self.view addSubview:_overlayView];
}
else
{
[_overlayView removeFromSuperview];
}
return NO;
}
@end
должно быть достаточно реализовать следующий метод в вашем UISearchDisplayDelegate (который обычно является вашим пользовательским подклассом UITableViewController)
- (BOOL) searchDisplayController: (UISearchDisplayController *) controller shouldReloadTableForSearchString: (NSString *) searchString
{
[self startMyCustomWebserviceSearchAsBackgroundProcessForString: searchString]; //starts new NSThread
return NO;
}
ты пробовал это?
На основе приведенного ниже кода пользователя 182820 моя версия. Я скрываю табличное представление UISearchDisplayController. Когда в поле поиска вводится символ, я помещаю «затемненный вид», чтобы он выглядел так, как будто «затемненный вид» UISearchDisplayController никогда не исчезал, а затем удаляю его по окончании поиска. Если вы введете несколько символов и нажмете «Отмена», представление таблицы на короткое время станет белым, и я не знаю, как это обойти.
- (void)viewDidLoad {
...
tableViewMask=[UIView new];
tableViewMask.backgroundColor = [UIColor blackColor];
tableViewMask.alpha = 0.8;
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
tableViewMask.frame=CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+controller.searchBar.frame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height-controller.searchBar.frame.size.height);
controller.searchResultsTableView.hidden=YES;
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
[tableViewMask removeFromSuperview];
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
if (searchString.length==0)
[tableViewMask removeFromSuperview];
else
[self.tableView addSubview:tableViewMask];
[searchText autorelease];
searchText=[searchString retain];
return NO;
}
А как насчет того, чтобы сделать это так просто?
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
self.searchDisplayController.searchResultsTableView.hidden=YES;
return YES;
}
У меня отлично работает ..
Я думаю, что лучше, так как есть ошибка с "лучшим ответом" - разделитель и «нет результатов»; будет отображаться при прокрутке таблицы черного фона. Р>
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
controller.searchResultsTableView.backgroundColor = [UIColor blackColor];
controller.searchResultsTableView.alpha = 0.8;
controller.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
for(UIView *subview in tableView.subviews) {
if([subview isKindOfClass:UILabel.class]) {
subview.hidden = YES;
}
}
return NO;
}
- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
self.searchDisplayController.searchResultsTableView.backgroundColor = [UIColor whiteColor];
self.searchDisplayController.searchResultsTableView.alpha = 1;
self.searchDisplayController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
for(UIView *subview in tableView.subviews) {
if([subview isKindOfClass:UILabel.class]) {
subview.hidden = NO;
}
}
// search results and reload data ....
}
Все существующие ответы слишком сложны. Вы можете уйти, просто сразу скрыв представление таблицы результатов.
-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
tableView.hidden = YES;
}
Я думаю, что нашел лучшую реализацию для этой проблемы.Все предыдущие ответы правильно показывают затемненный вид, идентичный тому, как выглядит UITableView перед поиском, но в каждом решении отсутствует функция касания области, чтобы отменить поиск.
По этой причине я думаю, что этот код работает лучше.
Прежде всего, создайте BOOL, такой как searchButtonTapped, чтобы указать, была ли нажата кнопка поиска.По умолчанию это значение равно NO.
Тогда:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if (!searchButtonTapped) {
// To prevent results from being shown and to show an identical look to how the tableview looks before a search
[controller.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
[controller.searchResultsTableView setRowHeight:160];
self.searchDisplayController.searchResultsTableView.scrollEnabled = NO;
} else {
// Restore original settings
[controller.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
[controller.searchResultsTableView setRowHeight:44];
self.searchDisplayController.searchResultsTableView.scrollEnabled = YES;
}
return YES;
}
Теперь это должно быть ясно, основываясь на других ответах.Не забудьте также восстановить исходные настройки, когда пользователь нажимает на кнопку Поиска.
Кроме того, в методе cellForIndexPath добавьте:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.contentView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8];
Чтобы создать тот же затемненный вид, который отображается перед вводом текста.Убедитесь, что вы применили эти свойства к нужной ячейке, т. е. проверьте, какой UITableView активен и что пользователь не нажимал кнопку Поиска.
Затем, что особенно важно, в didSelectRowAtIndexPath:
if (tableView == self.searchDisplayController.searchResultsTableView) {
if (searchButtonTapped) {
// Code for when the user select a row after actually having performed a search
{
else
[self.searchDisplayController setActive:NO animated:YES];
Теперь пользователь может коснуться затемненной области, что не приведет к видимому выделению UITableViewCell, но вместо этого отменит поиск.