Я потратил довольно много времени на поиск в Интернете и безрезультатно разговаривал с другими разработчиками об этой проблеме. Точная проблема описана в этом сообщении SO (Сосредоточьтесь на UISearchBar но клавиатура не появляется), хотя ей много лет.
Недавно я перешел с использования устаревших UISearchDisplayController и UISearchBar в IB и перешел на UISearchController через код для iOS8.
Однако проблема, которую я получаю, заключается в том, что фокус назначен правильно (вы можете сказать, потому что кнопка отмены анимируется справа от панели поиска после загрузки представления), однако клавиатура не отображается.
Вот код, который у меня есть.
.h
@property (nonatomic, strong) UISearchController *searchController;
.m
- (void)viewDidLoad {
[super viewDidLoad];
...
[self initializeSearchController];
....
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.searchController setActive:YES];
[self.searchController.searchBar becomeFirstResponder];
}
- (void)initializeSearchController {
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.delegate = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
[self.tableView setTableHeaderView:self.searchController.searchBar];
self.definesPresentationContext = YES;
}
То, что я пробовал до сих пор.
Я пробовал вызвать статьFirstResponder с задержкой в 0,2 секунды, как это было предложено в другом сообщении SO.
Я установил точку останова в viewDidAppear и убедился, что как self.searchController, так и self.searchController.searchBar являются допустимыми объектами, а не nil.
Я пробовал соответствовать UISearchControllerDelegate и использовать следующий фрагмент кода
здесь:
- (void)didPresentSearchController:(UISearchController *)searchController {
//no matter what code I put in here to becomeFirstResponder, it doesn't
//matter because this is never called, despite setting the
//self.searchController.delegate = self AND
//self.searchController.searchBar.delegate = self.
}
Я создал новое представление с нуля в раскадровках и перешел к нему, чтобы убедиться, что в моем представлении нет какого-то старого остатка searchBar. Это тоже не сработало.
Я тестировал это только на реальном устройстве (iPhone 6), и это не проблема симулятора, когда не отображается клавиатура.
У меня нет идей, и я видел все вопросы и ответы, связанные с этим, в Интернете. Ничего не работает.
Чтобы еще раз прояснить, что происходит, searchBar правильно становится первым респондентом, кнопка отмены справа от него оживляет экран, доказывая это, но клавиатура не появляется, и курсор не мигает в searchBar.