Я нашел много лучшее решение этой проблемы, и, похоже, он отлично работает на 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 Категорию, чтобы заставить его работать везде, если это необходимо в вашем проекте):
// 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;
}
Наслаждайтесь! :)
большой материал, спасибо за этот – NSTJ
пытался выяснить это в течение нескольких дней сейчас Спасибо за решение! –
После тестирования этой реализации теперь я хочу выяснить, как заставить контейнер результатов поиска не мерцать, когда он добавляется в представление. Поскольку он добавлен с помощью метода searchDisplayControllerDidBeginSearch:, вы можете увидеть тусклый фон за долю секунды, пока не появится «searchResultsTableView». Любые мысли о том, как обойти это? Я попытался переместить строку кода в 'searchDisplayControllerDidBeginSearch' на метод' searchDisplayControllerWillBeginSearch ', но это заставляет тусклый фон размещаться перед 'searchResultsTableView' –