Клавиатура не исчезает после просмотра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];
}
}
Это будет проходить через ответчиков и уйти в отставку с состояния ответчика.