В iOS 6 - [UITextField статьFirstResponder] не работает в -viewWillAppear:
В iOS 5.1 и iOS 5.0 он работает, но в iOS 6.0 клавиатура не отображается.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Теперь я переместил логику в -viewDidAppear:
.
// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Это работает, но нежелательно. Сдвижная анимация клавиатуры отображается после загрузки вида.
Я хочу, чтобы клавиатура присутствовала, так как анимация "слайд-лево" отображает представление, загружаемое в навигационный контроллер.
Кто-нибудь знает, как загрузить клавиатуру, поскольку представление появляется в iOS 6?
Обновление
Основываясь на обращении @Duck, я сделал немного больше тестов. Это похоже на UITextFields, содержащиеся в UITableViewCells.
Есть ли у кого-нибудь предложения?
ПЕРВЫЙ РЕШЕНИЕ
Итак, полное описание. Это табличный вид с двумя статическими ячейками (адрес электронной почты и пароль). В представлении есть кнопка входа в систему, которой назначается представление нижнего колонтитула таблицы. Эти две ячейки имеют в них текстовое поле и имеют тип SICOTextFieldCell нестандартного типа.
Моим решением было поместить поддельное текстовое поле за кнопкой входа (в виде нижнего колонтитула таблицы).
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.SICO_fakeTextField;
[textField becomeFirstResponder];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.SICO_emailAddressTextField;
[textField becomeFirstResponder];
}
НОВОЕ РЕШЕНИЕ
Основываясь на ответе @stm, я придумал новое (превосходное?) решение.
Мое решение состояло в вызове -selectRowAtIndexPath:animated:scrollPosition:
. -[SICOTextFieldCell setSelected:animated:]
, который является настраиваемой ячейкой представления таблицы, вызывает [self.textField becomeFirstResponder]
, который волшебным образом рисует клавиатуру. Это все еще взломать, но это чище взломать.
@interface SICOLogInViewController ()
@property (readonly, nonatomic) UITextField *SICO_emailAddressTextField;
@property (readonly, nonatomic) UITextField *SICO_passwordTextField;
@end
@implementation SICOLogInViewController
- (IBAction)logIn
{
// Controller Details
}
#pragma mark Private
- (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath
{
SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath];
return cell.textField;
}
#pragma mark View lifecycle
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:NO scrollPosition:UITableViewScrollPositionTop];
}
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
switch (textField.returnKeyType) {
case UIReturnKeyGo: [self logIn]; break;
case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break;
default: break;
}
return YES;
}
#pragma mark Properties
- (UITextField *)SICO_emailAddressTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
}
- (UITextField *)SICO_passwordTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
}
@end
Ответы
Ответ 1
Попробуйте вызвать его в методе cellForRowAtIndexPath после создания ячейки или в viewWillAppear таблицы TableCell, которая содержит этот textField.
Если это дает вам тот же результат, и вы все еще хотите, чтобы клавиатура появлялась раньше, я бы использовал "фальшивый" текстовый экран для отображения клавиатуры в начале. Я предполагаю, что ваш textField не был добавлен перед viewWillAppear.
Ответ 2
Я пробовал ваш код точно, iOS6 и в viewWillAppear, и он, похоже, работал нормально.
Ваша попытка заставить клавиатуру уже отображаться, когда вы переходите к другому виду, я прав?
Ответ 3
В настоящее время я пишу свой собственный набор входных форм и с этой проблемой боролся несколько часов.
Узнав, что моя кодировка в порядке, я нашел этот вопрос, указывающий на возможный сбой в iOS 6 и работал над решением для этого.
Если у вас (или создается) пользовательский UITableViewCell, простым решением будет просто подкласс - (void) layoutSubviews; и проверьте, должен ли ячейка UITextField быть первым ответчиком (то есть, проверяя, совпадает ли текстовое поле с целым полем, заданным в вашем делетете).
Если это так, просто позвоните - (BOOL), а затем - FirstResponder; на вашем UITextField (снова).
Это, безусловно, лучшее решение, чем создание "поддельного" UITextField;)
Ответ 4
-viewWillAppear, возможно, не вызывается в iOS6? Вы пытались поместить свой код в - (void)viewWillLayoutSubviews
?