[英]How to dismiss keyboard in IOS Swift from a subview inside a scroll view in the main view?
我在主视图的滚动视图中有2个子视图。 基于滚动视图中的两个按钮,两个子视图将显示和隐藏。 两个子视图都有一个文本字段,每个文本字段都可以输入数字。 键盘是数字键盘。 我已经为子视图实现了func touchesBegan
和UITapGestureRecognizer
,并添加了resignFirstResponder()
和endEditing(true)
。 但是我的键盘仍然没有消失。 我无法在任何论坛中找到针对此类情况的适当解决方案。
我正在使用Swift 2.0 xcode7.1.1
编辑:我的代码(由于这是一个业务项目,所以我无法共享全部内容,抱歉)
在此代码中,当我在viewAutomatic
触摸外部时,键盘就消失了。 但是当我在viewManual
触摸外部时,键盘没有关闭。 对我来说太奇怪了。
@IBOutlet weak var viewScroll: UIScrollView!
@IBOutlet weak var txtNewBid: UITextField!
@IBOutlet weak var txtMyMaxBid: UITextField!
@IBOutlet weak var viewManual: UIView!
@IBOutlet weak var viewAutomatic: UIView!
override func viewDidLoad() {
let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: "singleTapped:")
singleTapGestureRecognizer.numberOfTapsRequired = 1
singleTapGestureRecognizer.numberOfTouchesRequired = 1
singleTapGestureRecognizer.enabled = true
singleTapGestureRecognizer.cancelsTouchesInView = false
self.viewManual.addGestureRecognizer(singleTapGestureRecognizer)
self.viewAutomatic.addGestureRecognizer(singleTapGestureRecognizer)
}
override func viewWillAppear(animated: Bool) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
func singleTapped(sender: UITapGestureRecognizer) {
self.view.endEditing(true)
self.viewManual.endEditing(true)
self.viewAutomatic.endEditing(true)
self.viewScroll.endEditing(true)
txtNewBid.resignFirstResponder()
txtMyMaxBid.resignFirstResponder()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
txtNewBid.resignFirstResponder()
txtMyMaxBid.resignFirstResponder()
}
func keyboardWillShow(notification: NSNotification) {
// adjusting the scroll view for the keyboard
let frame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
if( self.viewManual.hidden == true)
{
self.viewScroll.frame.size.height -= frame.height
}
else
{
self.viewScroll.frame.size.height -= frame.height
}
let bottomOffset: CGPoint = CGPointMake(0, self.txtNewBid.frame.origin.y + self.txtNewBid.frame.size.height)
self.viewScroll.contentOffset = bottomOffset
}
func keyboardWillHide(notification: NSNotification) {
let frame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
if( self.viewManual.hidden == true)
{
self.viewScroll.frame.size.height += frame.height
}
else
{
self.viewScroll.frame.size.height += frame.height
}
}
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
txtNewBid.text = ""
txtMyMaxBid.text = ""
}
我的猜测是您正在以错误的方式解决问题。 我认为控制器应该负责关闭键盘,但是您可以尝试执行以下操作(最好在托管视图控制器上):
yourView.endEditing(true) // boolean parameter specifies whether to force dismissal or not
endEditing(force)
应该遍历视图层次结构并检查是否有任何活动的响应者,因此这实际上应该起作用。 您是否检查过您是否确实引用了正确的视图? 您能否添加一些代码(请仅添加必要的部分)?
我指出,在托管控制器的视图上调用此控件很重要,因为它会遍历所有子视图并检查任何活动的响应者。
如果您对文本字段有一个引用,并且您知道它是哪一个,也可以致电
yourTextField.resignFirstResponder()
我想这就是endEditing(force)
内部执行的操作,它遍历所有子视图,并在遇到的任何resignFirstResponder()
也是第一个响应者resignFirstResponder()
上调用resignFirstResponder()
。
由于UIScrollView
会拦截手势,因此我可以将滚动手势识别器直接添加到滚动视图中,如下所示:
self.viewScroll.addGestureRecognizer(singleTapGestureRecognizer)
然后执行以下操作:
func singleTapped(sender: UITapGestureRecognizer) {
// this should suffice
self.viewScroll.endEditing(true)
// or call it on the touched view (in this case the viewScroll)
// sender.view.endEditing(true)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.