Клавиатура не исчезает после просмотраDidDisappear на iOS 7

В нашем приложении есть ситуация, когда пользователь вводит что-то в текстовое поле, а затем нажимает кнопку "Назад", чтобы вернуться к главному экрану.

Если мы запустим это на iOS 7, клавиатура не исчезнет, ​​она просто останется там. Пользователь все равно может перемещаться по приложению, но все текстовые поля отключены, то есть вы не можете вводить текст в любом месте. Единственный вариант, который у пользователя есть, - это убить приложение и начать новый.

Мы попытались добавить resignFirstResponder сообщения, но это ничего не помогло.

Там много кода, и мы активно работаем над этой проблемой. Между тем, кто-нибудь испытал эту проблему и, возможно, нашел способ уйти от нее.

Ответ 1

У меня была такая же проблема, как и вы, когда я скомпилировал приложение для iOS 7, и я сделал следующие изменения:

  • Убедитесь, что вы добавили [textfield resignFirstResponder], прежде чем отклонить viewController, например:

    [_passwordInput resignFirstResponder];
    [_emailInput resignFirstResponder];
    [self performSegueWithIdentifier:@"forgotPassword" sender:self];
    
  • Чтобы убедиться, что клавиатура исчезает, добавьте [textfield resignFirstResponder] в viewWillDisappear, например:

    - (void) viewWillDisappear:(BOOL)animated
    {
       [_passwordInput resignFirstResponder];
       [_emailInput resignFirstResponder];
    }
    
  • Если ваш viewController представлен с помощью UIModalPresentationFormSheet, добавьте его в свой viewController, чтобы убедиться, что текстовые поля будут отвечать resignFirstResponder:

    - (BOOL)disablesAutomaticKeyboardDismissal
    {
       return NO;
    }
    

В вашем случае отмените действие кнопки "Назад" или просто используйте viewWillDisappear, чтобы проверить, когда пользователь нажал кнопку "Назад", а затем вызовите resignFirstResponder до [super viewWillDisappear] примерно так:

-(void) viewWillDisappear:(BOOL)animated 
{
   [_passwordInput resignFirstResponder];
   [_emailInput resignFirstResponder];
   [super viewWillDisappear:animated];
}

Ответ 2

Попробуйте [self.view resignFirstResponder] вместо [textfield resignFirstResponder] в viewWillDisappear.

Ответ 3

[textfield resignFirstResponder] должен выполнить задание, но для того, чтобы не зацикливать все ваши текстовые поля, вы можете использовать:

[self.view endEditing:YES];

Из документа:

использовать, чтобы сделать представление или любое подзадачу, которое является первым ответчиком, уходит в отставку (необязательно сила).

Ответ 4

в целом я нахожу это полезным

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

вы можете добавить это в viewWillDisappear: или viewDidDisappear:

это скроет клавиатуру без ссылки на текущее сфокусированное текстовое поле

Ответ 5

У меня была та же проблема только с MoreViewController в UITabBarController (iOS 8.3). Возможно, это решение не очень "приятно" и немного сложно, но похоже, что оно работает, надеюсь, что это тоже поможет.

@interface ViewController ()

@property (nonatomic) BOOL needToHideKeyboard;
@property (nonatomic, strong) IBOutlet UITextField *txtField;
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.needToHideKeyboard = NO;
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    [self hideKeayboard];
}

- (void)hideKeayboard
{
    if (self.needToHideKeyboard) {
        [self.txtField resignFirstResponder];
    }
}

- (void)keyboardWasShown:(NSNotification *)notification
{
    self.needToHideKeyboard = YES;

    NSDictionary *info = [notification userInfo];
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // Shift scroll view content insets on the keyboard height
    UIEdgeInsets contentInsets = self.scrollView.contentInset;
    contentInsets.bottom = keyboardSize.height;
    self.scrollView.contentInset = contentInsets;
}

- (void)keyboardWillBeHidden:(NSNotification *)notification
{
    self.needToHideKeyboard = NO;

    // Reset keyboard content insets
    UIEdgeInsets contentInsets = self.scrollView.contentInset;
    contentInsets.bottom = [self.bottomLayoutGuide length];
    self.scrollView.contentInset = contentInsets;
}

@end

Ответ 6

Если ваш контроллер представления реализует textFieldDidEndEditing, убедитесь, что вы не устанавливаете другое представление в качестве первого ответчика, если вид исчезает. textFieldDidEndEditing вызывается при вызове resignFirstResponder или [self.view endEditing:YES].

Ответ 7

[self.view endEditing:YES];

перестала работать на моем устройстве iOS9.x

Мы также можем сделать это в методе viewWillDisappear

for (UIView *subview in self.view.subviews) {
        if ([subview canPerformAction:@selector(endEditing:) withSender:nil]) {
            [subview endEditing:YES];
        }
        if ([subview canResignFirstResponder]) {
            [subview resignFirstResponder];
        }
    }

Это будет проходить через ответчиков и уйти в отставку с состояния ответчика.