Я нашел намного лучшее решение этой проблемы, и, похоже, оно отлично работает на 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: метод.Но это не имеет смысла для меня, так как, конечно, когда вы отменяете поиск, ему нужно будет действительно скрыть таблицу результатов, и вам может потребоваться запустить код в этом случае.Мое решение для этой части - создать подкласс (обратите внимание, что вы, вероятно, могли бы использовать метод Swizzled Category, чтобы он работал везде, где это необходимо в вашем проекте):
// 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 и измененияноль или пустые строки в пробел @ "" предотвращают нормальное скрытие / затемнение, которое происходит на пустой панели поиска.Если вы используете этот второй бит кода, то вы можете изменить первый бит, чтобы передать ноль вместо @ "", так как этот второй бит сделает необходимое преобразование в @ "" для вас.
В моемВ своем собственном проекте мне нужно было обработать случай, когда пользователь вводит пробел, поэтому вместо @ "" выше я использовал определенный токен:
// arbitrary token used internally
#define SEARCH_PRELOAD_CONDITIONAL @"_#preresults#_"
И затем обработал его внутренне, преобразовав его обратно в ноль-строку:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString isEqualToString: SEARCH_PRELOAD_CONDITIONAL])
searchString = nil;
}
Наслаждайтесь!:)