Я потратил немало времени на поиск в Интернете и разговоры с другими разработчиками об этой проблеме безрезультатно. Точная проблема описана в этом сообщении 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;
}
То, что я пробовал до сих пор.
-
Я пробовал называть startFirstResponder с задержкой в 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.