在iOS7中的viewWillDisappear期间,无法再隐藏键盘

时间:2013-12-01 23:39:42

标签: ios objective-c ios7 keyboard xcode5

以下代码在iOS6中用于在视图控制器弹出导航堆栈时隐藏键盘:

- (void)viewWillDisappear:(BOOL)animated {
    [self.view endEditing:YES];
    [super viewWillDisappear:animated];
}

但是,在iOS7中,[self.view endEditing:YES]行似乎被忽略了。我在其他视图事件(viewDidDisappear,viewWillAppear和viewDidAppear)中尝试了该命令,并且它唯一使用的是viewDidAppear。似乎一旦启动了“pop”,我们将失去隐藏键盘的能力,直到视图控制器被“推回”到堆栈上。

虽然将代码放在viewDidAppear中确实可以隐藏键盘,但不好的是当viewController被推回到导航堆栈时,键盘会短暂显示......从UI的角度来看,这是非常不可接受的。

有没有其他人成功解决这个问题?我宁愿不必编写自己的CANCEL按钮,但是现在,这是我能想到的唯一可以工作的东西。

7 个答案:

答案 0 :(得分:2)

如果UITextVieweditable属性设置为NO。我试过这个,它一旦设置就隐藏了键盘。我没有尝试使用UITextField,但我猜测您将enabled属性设置为NO会得到相同的结果。如果这不起作用,请创建UITextFielduserInteractionEnabled设置为NO作为透明UITextView的背景,并使用editable属性作为如上所述。

答案 1 :(得分:1)

iOS 7中有一个更改,默认情况下,以模式形式显示的视图控制器无法关闭键盘。要解决此问题,您需要覆盖视图控制器的disablesAutomaticKeyboardDismissal方法并返回NO

答案 2 :(得分:0)

问题在于,在我按下“BACK”按钮和viewWillDisappear触发的时间之间,当前文本字段的canResignFirstResponder被设置为FALSE,这会阻止键盘隐藏。我无法在我的代码中发现可能导致此问题的任何内容,我强烈怀疑它可能是某种iOS 7错误,因为相同的代码在iOS 6下适用于我。

作为一种解决方法,我实施了以下解决方案。我将UINavigationController子类化并覆盖以下方法:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    [self.topViewController.view endEditing:YES];
    return [super popViewControllerAnimated:animated];
}

当我点击“后退”按钮弹出当前视图控制器时,这会导致键盘正常消失。很高兴,我没有必要写一堆自定义后退按钮。

答案 3 :(得分:0)

在文本字段失去焦点时隐藏键盘

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{

  if ([textField isFirstResponder])
        [textField resignFirstResponder];

    return YES;
}

答案 4 :(得分:0)

我尝试了一种解决方法。这可能不是你们所期待的。

如果您使用的是故事板,则可以使用“ prepareForSeuge ”方法重新设置键盘。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    [self.view endEditing:YES];
}

它对我来说很好。

答案 5 :(得分:0)

下面给出的方法肯定会隐藏iOS7中的状态栏。

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

将其添加到.plist文件中(转到应用程序设置中的“信息”)

View controller-based status bar appearance --- NO

然后你可以调用这一行来隐藏状态栏:

[[UIApplication sharedApplication] setStatusBarHidden:YES];

如果您的应用程序开发为仅支持iPhone,则在iPad中运行应用程序时状态栏将不会隐藏。

答案 6 :(得分:-1)

将您的UItextfield或UItextview用于全局声明。

UITextfield textfield =您的文本字段对象;

-(void)viewWillDisappear:(BOOL)animated 
{

    [self.view endEditing:YES];
    [textfield resignFirstResponder];
    [super viewWillDisappear:animated];
}