2014-10-06 4 views
30

У меня есть UISearchController с UITableViewController как searchResultsController, то UISearchBar этого searchController установлен быть в tableHeaderView моей нынешней tableView отображается в моем корневом ViewController. Как и ожидалось, почти все работает хорошо. Но в анимации UISearchBar (Когда я нажимаю на searchBar и UINavigationBar шкуры, а searchBar уходит в начало, как в UISearchDisplayController), у меня странное поведение. Вместо того, чтобы переместиться в положение UINavigationBar (y: 0), он выпрыгивает из экрана и запускает анимацию, которая показывает кнопку отмены. Я попытался переместить мой код-экземпляр в viewDidLoad вместо init, и все будет точно так же. Я думаю, что центр проблемы находится в кадре searchResultsController, но я не уверен в этом (я пробовал устанавливать кадр без успеха). Все, что я делаю, - это чистый код.UISearchController SearchBar в tableHeaderView анимировать из экрана

Вот соответствующая часть коды:

self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController]; 
    self.searchController.delegate = self; 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.searchBar.delegate = self; 

    [self.searchController.searchBar sizeToFit]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 

    self.searchController.definesPresentationContext = YES; 

И у меня есть ленивые нагрузки для searchResultsController:

- (UITableViewController *)searchResultsController { 
if (_searchResultsController == nil) { 
    _searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 
    _searchResultsController.tableView.delegate = self; 
    _searchResultsController.tableView.dataSource = self; 

return _searchResultsController; 

}

Я скачал пример код из Apple, но они используют storyBoards и xib для UITableViewCell, SearchController отлично работает в проекте. У кого-то была такая же проблема? Как я могу это исправить? Любые решения или предложения будут оценены.

Спасибо за внимание.

+0

Вы когда-нибудь выяснить этот вопрос? В настоящее время проблема аналогична моей строке поиска. – Lorenzo

+0

Нет, Лоренцо. К сожалению, я использовал устаревший api для этой проблемы. С раскадройками это работает хорошо (я попробовал пример приложения из apple), но в коде у меня появилась эта странная ошибка. –

+0

Хорошо, спасибо в любом случае. Не могли бы вы подробнее рассказать о методе, который вы использовали? Я также рассматривал пример Apple, и они используют раскадровки для таблицы и подробного представления, но все компоненты панели поиска выполняются в коде, это вы сделали? – Lorenzo

ответ

19

Вы пытались установить для hidesNavigationBarDuringPresentation значение false? решаемые моя головная боль ..

self.searchController.hidesNavigationBarDuringPresentation = false; 

Ввод SearchBar в навигационной панели дает более солидный опыт пользователя, на мой взгляд (для Iphone)

self.navigationItem.titleView = self.searchController.searchBar; 
+0

I Я уже пробовал это, но не работал. Спасибо, в любом случае! –

+0

это исправлено для меня, но какая глупая ошибка – malhal

+0

Удивительно это именно то, что я искал, спасибо большое. Действительно, панель поиска должна находиться в панели навигации. –

13

Чтобы сделать это более ясным @ ответ Лоренцо работал для меня ,

self.definesPresentationContext = YES; 
+0

Это не работает для меня. –

+0

Человек ты мой герой дня! –

+2

Противоположная работа для меня! У меня был 'UIView' как контейнер для строки поиска, между навигационной панелью и табличным представлением для результатов. Мне пришлось установить 'self.definesPresentationContext' на' false', чтобы контейнер не прыгнул примерно на 44 пикселя при активации панели поиска. – Echelon

22

Добавить

self.extendedLayoutIncludesOpaqueBars = YES; 

на viewDidLoad методом

+0

Это сработало для меня. Ты спас мой день! Благодарю. – Sai

+0

Работа с UITableViewController вместе с UISearchController, это исправило эту проблему для меня. – Senry

5

Попробуйте это:

Прежде всего, необходимо делегировать

UISearchControllerDelegate

Для Swift

func willPresentSearchController(searchController: UISearchController) { 
    self.navigationController?.navigationBar.translucent = true 
} 

func willDismissSearchController(searchController: UISearchController) { 
    self.navigationController?.navigationBar.translucent = false 
} 
+1

Я удивлен, как хорошо это работает. – Can

0

Я заметил, что UISearchController прекрасно работает в одном из моих взглядов, но не другой. Проблема была в UITableViewController, а не в UIViewController. Если вы переключитесь на UIViewController с UITableView внутри него и должным образом ограничены, проблем нет.Я реализовал мой с XIB, и он отлично работал.

1

СВИФТ 3,01

func willPresentSearchController(searchController: UISearchController){ 
self.navigationController?.navigationBar.isTranslucent = true 
} 

func willDismissSearchController(searchController: UISearchController) { 
self.navigationController?.navigationBar.isTranslucent = false 
} 
3

В Swift, попробуйте:

override func viewDidLoad() { 
    edgesForExtendedLayout = [] 
    searchController.hidesNavigationBarDuringPresentation = false 

    // ... 
} 
Смежные вопросы