iPhone:隐藏应用程序上的键盘输入背景或视图消失

Posted

技术标签:

【中文标题】iPhone:隐藏应用程序上的键盘输入背景或视图消失【英文标题】:iPhone: Hide Keyboard on App Did Enter Background or View Did Disappear 【发布时间】:2012-08-18 12:36:50 【问题描述】:

我有一个 UISearchBar,点击它会显示键盘。 但是,如果用户在显示键盘时按下主页按钮,然后返回应用程序,则键盘仍然可见。 应用关闭/进入后台时如何隐藏键盘?

我在 viewDidDisappear 中尝试了以下方法:

[eventSearchBar resignFirstResponder];

[eventSearchBar endEditing:YES];

我也在 appDidEnterBackground 的委托中尝试过这个:

[self.rootController.navigationController.view endEditing:YES];

这些都不起作用。

【问题讨论】:

你在 willEnterBackground 中试过了吗? 我认为没有 willEnterBackground 方法 有一个applicationWillResignActive: 方法。阅读:developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/… 谢谢,我在这种方法中尝试了 resignFirstResponder 和 endEditing 但仍然没有运气,rootController.navigationController.view 是调用它的正确方法吗? 顺便说一下rootController的类型是TabBarController 【参考方案1】:

您可以在 appDelegate 中执行此操作....

- (void)applicationDidEnterBackground:(UIApplication *)application

    [self.window endEditing:YES];

【讨论】:

viewWillDisappear 在应用进入后台时不会被调用。 这可能是一个品味问题。我更喜欢在它适用的视图控制器中本地执行此操作。 这是您问题的唯一解决方案...因为当应用程序最小化时既不会调用 viewwillapper 也不会调用 viewwilldisapper...如果您想这样做,那么您必须在 applicationDidEnterBackground 方法中执行此操作。 或者您必须在 applicationDidEnterBackground 中访问您的视图...然后您可以执行 [self.view endEditing:YES];... 把这个方法放到你的APPDELEGATE.M中【参考方案2】:

这个的 Swift 版本:

func applicationDidEnterBackground(application: UIApplication) 
    window?.endEditing(true)

【讨论】:

【参考方案3】:

在您的视图控制器中,例如在 init 方法中,注册UIApplicationWillResignActiveNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(willResignActive:)
    name:UIApplicationWillResignActiveNotification
    object:nil];

当应用程序进入后台时,使搜索显示控制器处于非活动状态。这会从搜索字段中移除焦点并隐藏键盘:

- (void)willResignActive:(NSNotification *)note

    self.searchDisplayController.active = NO;

    // Alternatively, if you only want to hide the keyboard:
    // [self.searchDisplayController.searchBar resignFirstResponder];

并且不要忘记在 dealloc 方法中移除观察者:

[[NSNotificationCenter defaultCenter] removeObserver:self
    name:UIApplicationWillResignActiveNotification
    object:nil];

【讨论】:

我更喜欢这个解决方案,因为它只与相关视图隔离。 @dangytaggart:是的,我就是这么想的。感谢您的反馈!【参考方案4】:

我的所有标准方法都偶尔失败。到目前为止,这是我获得可靠结果的唯一方法。

在最顶层的控制器中。

- (void)viewDidLoad 
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActiveNotification:) name:UIApplicationWillResignActiveNotification object:nil];


-(void) willResignActiveNotification:(NSNotification*) vNotification 
    [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
    [self setEditing:NO];

有一种奇怪的情况,文本字段将不再响应resignFirstResponderendEditing,但键盘仍处于打开状态。

【讨论】:

【参考方案5】:

swift 3.2 版本中的解决方案

    override func viewDidLoad() 
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(hideTextField), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
    

    deinit 
        NotificationCenter.default.removeObserver(self)
    

    func hideTextField()
        eventSearchBar.endEditing(true)
    

【讨论】:

【参考方案6】:

最好的办法是把 window?.endEditing(true) 放在 AppDelegate 上的 applicationWillResignActive 中:

func applicationWillResignActive(_ application: UIApplication) 
    window?.endEditing(true)

【讨论】:

以上是关于iPhone:隐藏应用程序上的键盘输入背景或视图消失的主要内容,如果未能解决你的问题,请参考以下文章

单击或触摸另一个视图时清除EditText焦点并隐藏键盘

iPhone 6 模拟器,隐藏键盘问题

获取没有文本字段/视图的键盘输入

输入焦点时隐藏ios设备上的键盘

键盘上的 QuickType 栏

解决IQKeyboard键盘引起的视图上移