在iOS 7上的viewDidDisappear之后,键盘不会消失

时间:2013-09-19 10:53:34

标签: ios ios7 uikeyboard

在我们的应用程序中,用户可以在文本框中输入内容,然后按后退按钮返回主屏幕。

如果我们在iOS 7上运行它,键盘不会消失,它只会停留在那里。用户仍然可以浏览应用程序,但所有文本字段都被禁用,这意味着您无法在任何地方输入文本。用户唯一的选择就是杀死应用并重新开始。

我们尝试添加resignFirstResponder条消息,但这没有任何帮助。

涉及的代码很多,我们正在积极处理这个问题。与此同时,也有人遇到过这个问题,也许有办法让它消失?

7 个答案:

答案 0 :(得分:8)

当我为iOS 7编译应用程序时,我遇到了和你一样的问题,我做了以下更改:

  1. 请确保在解除viewController之前添加[textfield resignFirstResponder],例如:

    [_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;
    }
    
  4. 在您的情况下,覆盖后退按钮操作或仅使用viewWillDisappear检查用户何时按下后退按钮,然后在resignFirstResponder [super viewWillDisappear]之前调用-(void) viewWillDisappear:(BOOL)animated { [_passwordInput resignFirstResponder]; [_emailInput resignFirstResponder]; [super viewWillDisappear:animated]; }

    {{1}}

答案 1 :(得分:0)

在viewWillDisappear上尝试[self.view resignFirstResponder],而不是[textfield resignFirstResponder]

答案 2 :(得分:0)

[textfield resignFirstResponder]应该完成这项工作,但要确保并且不要遍历你可以使用的所有textField:

[self.view endEditing:YES];

来自doc:

  

用于制作视图或第一个响应者辞职的任何子视图   (可选择强制)。

答案 3 :(得分:0)

一般来说我觉得这很有用

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

您可以在viewWillDisappear:viewDidDisappear:

中添加此内容

这将隐藏键盘而不引用当前聚焦的文本字段

答案 4 :(得分:0)

我在MoreViewControllerUITabBarController)中仅与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

答案 5 :(得分:0)

如果视图控制器实现textFieldDidEndEditing,请确保在视图消失时不将另一个视图设置为第一个响应者。当您致电textFieldDidEndEditingresignFirstResponder时,系统会调用[self.view endEditing:YES]

答案 6 :(得分: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];
        }
    }

这将循环响应者并重新响应响应者状态。