Поведение клавиатуры iOS7 с помощью SearchBar/UITableView: смещение при отображении дополнительных представлений

проблема

У меня довольно большая проблема с появлением клавиатуры iOS7. У меня есть панель поиска на UIViewController с настройкой делегирования / источника данных TableView (я также использую делегаты self.searchDisplayController). Я перехожу из этой сцены к прототипу таблицы, чтобы показать результаты.

Вот проблема:

При первой загрузке я вижу отображаемую клавиатуру, когда я нажимаю на текстовое поле UISearchBar. Я могу напечатать и выполнить поиск с результатами, показанными в следующей сцене.

Я добавил NSNotifications для просмотра свойств клавиатуры в локальных методах keyboardWillShow и keyboardWasShown. Я вижу на первой сцене появление (после того, как представление полностью загружено):

Клавиатура показана

На этом этапе я перехожу к просмотру таблицы результатов, и когда я возвращаюсь назад и касаюсь текстового поля, моя клавиатура отображается полностью или частично за кадром:

Частичная клавиатура

Когда я смотрю на уведомление клавиатуры WillShow в этот момент, я вижу, что мои значения клавиатуры неверны:

Второй раунд

Я исследовал и попробовал много возможностей, включая:

Добавил следующее в мой основной контроллер вида:

-(BOOL)canResignFirstResponder
{
    return YES;
}
-(BOOL)canBecomeFirstResponder
{
    return YES;
}

Настроил следующее, на мой взгляд, сделал загрузку

self.searchDisplayController.searchBar.spellCheckingType = UITextSpellCheckingTypeNo;
    self.searchDisplayController.searchBar.autocapitalizationType=  UITextAutocapitalizationTypeNone;
    self.searchDisplayController.searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
    self.searchDisplayController.searchBar.keyboardType = UIKeyboardTypeDefault;

Положите в стандартные заглушки для:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar

Я заметил, что если я выберу Partial Curl в качестве режима segue, клавиатура останется доступной, когда я вернусь к контроллеру основного вида (но в этом случае она никогда не была полностью отключена от экрана). Однако, если я перейду от просмотра таблицы результатов к сцене детализации, а затем вернусь к контроллеру основного вида, клавиатура снова появится за кадром.

Вопрос

Есть ли способ, который я могу использовать, чтобы перехватить неуместную клавиатуру, чтобы она отображалась в расположении по умолчанию?

NB. Кроме того, я создал свойство NSDictionary для хранения начальных значений userInfo с правильным расположением клавиатуры. Я не уверен, как переназначить эти значения, чтобы вернуть клавиатуру в исходное положение.

Кстати, это похоже на хак, чтобы исправить клавиатуру из-за ошибки в IB, есть ли другой способ, которым я могу попытаться исправить ситуацию?

Заранее спасибо за любые отзывы!

1 ответ

Решение

Решение

Это была такая неясная проблема, что я разделяю решение, чтобы сэкономить следующему человеку немного усилий. Как и большинство проблем программирования, выясняется, что этот был причинен самому себе. В своей первоначальной итерации этого проекта я отключил поддержку ротации, поскольку я изучал автоматическое размещение и хотел облегчить переход от Springs и Struts. Каким-то образом между началом проекта и выпуском кода я получил этот фрагмент кода в контроллере представления главных сцен.

//BAD
- (NSUInteger) supportedInterfaceOrientations  
{
    return !UIInterfaceOrientationPortraitUpsideDown;
}

вместо того, чтобы возвращать правильное перечисление как...

//OK
- (NSUInteger) supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}
Другие вопросы по тегам