Подтвердить что ты не робот

Динамическое изменение типа клавиатуры для 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;
    }
}

Я знаю, что метод вызван, и правильный случай срабатывает, когда выбранная кнопка выбрана. Но экранная клавиатура не изменяется, если я не коснусь кнопки "Отмена", чтобы скрыть клавиатуру, а затем снова коснитесь поля поиска, чтобы снова открыть клавиатуру.

Есть ли способ заставить клавиатуру изменить себя во время экранного экрана или программно скрыть его, а затем просмотреть его?

4b9b3361

Ответ 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, может инициировать уведомление клавиатуры, поэтому может повлиять на другую логику, которая зависит от уведомления клавиатуры и влияет на кадр представления, который зависит от изменения кадра клавиатуры.