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

В 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
4b9b3361

Ответ 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?