【发布时间】:2016-09-23 16:53:00
【问题描述】:
如何识别在打开和关闭键盘时单击了其他视图。另一个视图可以在父控制器或屏幕上显示的其他控制器中。
【问题讨论】:
-
当另一个控制器出现在视图上时,父控制器调用 endediting 在视图上的 viewdiddisappear 怎么样
标签: ios cocoa-touch uitextfield
如何识别在打开和关闭键盘时单击了其他视图。另一个视图可以在父控制器或屏幕上显示的其他控制器中。
【问题讨论】:
标签: ios cocoa-touch uitextfield
因为在您的情况下,您可能会在屏幕上显示不止一个 viewController,因此处理此问题的最佳方法是使用 Notification Pattern
通知当前的Observer(customView 或 ViewControler)它的textField/textView(即当前的firstResponder,即键盘显示)应该resignFirstResponder(并关闭键盘)。
注册以观察(TextField 或 TextView)上 BeginEditing 中的任何 DismissKeyboardNeededNotification:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyboard) name:DismissKeyboardNeededNotification object:nil];
return YES;
}
在 EndEditing 中移除观察者到通知(DismissKeyboardNeededNotification)
-(void)textFieldDidEndEditing:(UITextField *)textField{
[self.textField resignFirstResponder];
[[NSNotificationCenter defaultCenter] removeObserver:self name:DismissKeyboardNeededNotification object:nil];
}
如果当前 ViewController 收到通知,那么它只需要求文本字段 resignFirstResponder 以解除键盘
-(void)dismissKeyboard{
[self.textField resignFirstResponder];
//or if you have many textField/TextView find it resignFirstResponder
//[self.textView1 isFirstResponder] then resignFirstResponder
}
当视图被录制/选择时(UITextView 或 UITextView 除外)从任何 viewController 只需发布通知以要求在需要时关闭键盘,如果当前显示键盘,则您的一个 ViewController 正在观察该通知并将处理.
[[NSNotificationCenter defaultCenter] postNotificationName:DismissKeyboardNeededNotification object:nil userInfo:nil];
注意:所有 VC 都可以访问此公共字符串:
NSString* DismissKeyboardNeededNotification = @"DismissKeyboardNeededNotification";
【讨论】:
尝试在 viewController 的主视图上设置点击手势识别器。当它被点击时调用view.endEditing(true)。
如果您有其他手势识别器并且不想干扰它们,请尝试设置点击识别器,创建对其的引用(如果在情节提要中进行),然后在 textFieldDidBeginEditing 中将识别器设置为启用,并在textFieldDidEndEditing 中将其设置为禁用。
代码 sn-p 仅出于善意:
class FakeViewController: UIViewController, UITextFieldDelegate {
private let viewTappedGestureRecognizer = UITapGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
setupGestureRecognizer()
}
private func setupGestureRecognizer() {
viewTappedGestureRecognizer.addTarget(self, action: #selector(viewWasTapped))
view.addGestureRecognizer(viewTappedGestureRecognizer)
}
func viewWasTapped(sender: UITapGestureRecognizer) {
view.endEditing(true)
}
// MARK: - TextField Delegate
func textFieldDidBeginEditing(textField: UITextField) {
viewTappedGestureRecognizer.enabled = true
}
func textFieldDidEndEditing(textField: UITextField) {
viewTappedGestureRecognizer.enabled = false
}
}
【讨论】: