2013-09-19 2 views
10

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

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

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

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

ответ

8

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

  1. Убедитесь, что вы добавить [textfield resignFirstResponder], прежде чем увольнять ViewController, например:

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

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

    - (BOOL)disablesAutomaticKeyboardDismissal 
    { 
        return NO; 
    } 
    

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

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

Кажется разбитым в iOS 8.0 - клавиатура снова появится, если вы снова войдете в экран с помощью панели поиска. –

+0

Клавиатура появляется снова при входе в экран. iOS 8.2 –

0

Попробуйте [self.view resignFirstResponder], а не [textfield resignFirstResponder] на видуWillDisappear.

0

[TextField resignFirstResponder] должен делать эту работу, но, чтобы убедиться, и не проходным всех TextFields вы можете использовать:

[self.view endEditing:YES]; 

Из док:

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

+1

Не работает для меня, кажется, что первый ответчик очищается до того, как вызывается 'viewWillDisappear', только конкретное указание текстового поля на отставку, похоже, работает. Непонятно, почему это происходит в iOS7. –

0

в целом я считаю это полезным

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

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

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

0

Я имел такая же проблема только с 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 
0

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

0
[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]; 
     } 
    } 

Этот цикл будет через ответчиков и уйти в отставку статус ответчика.

Смежные вопросы