16

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

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

[eventSearchBar resignFirstResponder];

[eventSearchBar endEditing:YES];

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

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

这些都不起作用。

4

6 回答 6

43

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

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self.window endEditing:YES];
}
于 2012-08-18T14:23:09.787 回答
7

这个的斯威夫特版本:

func applicationDidEnterBackground(application: UIApplication) {
    window?.endEditing(true)
}
于 2015-09-07T13:37:12.253 回答
4

在您的视图控制器中,例如在 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];
于 2012-08-18T14:25:22.307 回答
0

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

在最顶层的控制器中。

- (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仍然有键盘。

于 2015-04-28T19:25:19.207 回答
0

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

func applicationWillResignActive(_ application: UIApplication) {
    window?.endEditing(true)
}
于 2018-05-01T06:23:51.720 回答
0

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)
    }
于 2018-02-09T16:04:18.483 回答