Динамическое изменение типа клавиатуры для UISearchBar
У меня есть приложение для iPhone, которое использует UISearchBar
и UISearchDisplayController
. В строке поиска есть три кнопки масштаба. Я бы хотел, чтобы клавиатура была цифровой клавиатурой, когда выбрана определенная кнопка области, но будет клавиатурой по умолчанию, когда выбрана любая другая кнопка области.
Я реализовал метод UISearchBarDelegate
selectedScopeButtonIndexDidChange:selectedScope
следующим образом:
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
{
switch (selectedScope) {
case DeviceIDScopeIndex:
searchBar.keyboardType = UIKeyboardTypeNumberPad;
break;
default:
searchBar.keyboardType = UIKeyboardTypeDefault;
break;
}
}
Я знаю, что метод вызван, и правильный случай срабатывает, когда выбранная кнопка выбрана. Но экранная клавиатура не изменяется, если я не коснусь кнопки "Отмена", чтобы скрыть клавиатуру, а затем снова коснитесь поля поиска, чтобы снова открыть клавиатуру.
Есть ли способ заставить клавиатуру изменить себя во время экранного экрана или программно скрыть его, а затем просмотреть его?
Ответы
Ответ 1
Несмотря на то, что это своего рода хак, это сработало для меня:
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope {
switch (selectedScope) {
case 0:
searchBar.keyboardType = UIKeyboardTypeNumberPad;
break;
default:
searchBar.keyboardType = UIKeyboardTypeDefault;
break;
// Hack: force ui to reflect changed keyboard type
[searchBar resignFirstResponder];
[searchBar becomeFirstResponder];
}
Ответ 2
Если вы используете iOS 3.2 или новее, вы можете позвонить:
[searchBar reloadInputViews]
и он немедленно переключается без хакерства. По крайней мере, это работает для меня на UITextField. (Я упоминаю об этом, потому что увольнение/начало первого опроса ответчика не срабатывало точно для меня, но reloadInputViews сделали.)
Ответ 3
[searchBar reloadInputViews]
и
[searchBar resignFirstResponder];
[searchBar becomeFirstResponder];
оба могут работать, но второй метод имеет больший побочный эффект, меняет firstResponder, может инициировать уведомление клавиатуры, поэтому может повлиять на другую логику, которая зависит от уведомления клавиатуры и влияет на кадр представления, который зависит от изменения кадра клавиатуры.