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];
有一种奇怪的情况,文本字段将不再响应resignFirstResponder
或endEditing
,但键盘仍处于打开状态。
【讨论】:
【参考方案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:隐藏应用程序上的键盘输入背景或视图消失的主要内容,如果未能解决你的问题,请参考以下文章