Я нашел гораздо лучшее решение этой проблемы, и, похоже, оно отлично работает на iOS 6 и 7. Хотя это все еще хак, это гораздо более чистый и перспективный хак, чем описанный выше. Другие решения работают нестабильно и предотвращают запуск некоторых методов UISearchDisplayDelegate! Кроме того, у меня были сложные проблемы со вставкой, которые я не мог решить с помощью вышеуказанных методов. Основная проблема с другими решениями заключается в том, что они серьезно сбивают с толку внутреннее устройство UISearchDisplayController. Мое решение основано на наблюдении, что UISearchDisplayContoller является UISearchbarDelegate и что автоматическое снятие яркости и отображение таблицы результатов может быть запущено путем имитации нажатия клавиши в поле поиска! Так:
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
if ([controller respondsToSelector: @selector(searchBar:textDidChange:)])
[(id<UISearchBarDelegate>)controller searchBar: controller.searchBar textDidChange: @" "];
}
Этот код является будущим средством защиты от сбоев, проверяя, что он отвечает на метод UISearchbarDelegate и отправляет пробел @ "", чтобы обмануть UISearchDisplayController, заставив его думать, что пользователь ввел букву.
Теперь, если пользователь что-то набирает, а затем стирает, таблица снова тускнеет. Другие решения пытаются обойти это, делая что-то в методе searchDisplayController: didHideSearchResultsTableView :. Но для меня это не имеет смысла, поскольку, конечно, когда вы отмените поиск, вам нужно будет действительно скрыть вашу таблицу результатов, и в этом случае вам может потребоваться запустить код. Мое решение для этой части - создать подкласс (обратите внимание, что вы, вероятно, могли бы использовать категорию Method Swizzled, чтобы она работала везде, если это необходимо в вашем проекте):
// privately declare protocol to suppress compiler warning
@interface UISearchDisplayController (Super) <UISearchBarDelegate>
@end
// subclass to change behavior
@interface GMSearchDisplayController : UISearchDisplayController
@end
@implementation GMSearchDisplayController
- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchString
{
if (searchString.length == 0)
searchString = @" ";
if ([super respondsToSelector: @selector(searchBar:textDidChange:)])
[super searchBar: searchBar textDidChange: searchString];
}
@end
Этот код работает, перехватывая метод делегата textDidChange и заменяя пустые или пустые строки на пробел string @ "", предотвращая обычное скрытие / затемнение, которое происходит на пустой панели поиска. Если вы используете этот второй бит кода, то вы можете изменить первый бит так, чтобы он передавал ноль вместо @ "", поскольку этот второй бит выполнит необходимое преобразование в @ "" за вас.
В моем собственном проекте мне нужно было обработать случай, когда пользователь вводит пробел, поэтому вместо @ "" выше я использовал определенный токен:
// arbitrary token used internally
#define SEARCH_PRELOAD_CONDITIONAL @"_#preresults#_"
А затем обработайте его внутренне, преобразовав обратно в нулевую строку:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString isEqualToString: SEARCH_PRELOAD_CONDITIONAL])
searchString = nil;
}
Наслаждаться! :)
person
stonemonk
schedule
17.07.2014