ios - 如何从主视图中 ScrollView 内的 subview 中关闭 IOS Swift 中的键盘?

标签 ios iphone swift uikeyboard

我在主视图的 ScrollView 中有 2 个 subview 。基于 ScrollView 中的两个按钮,2sub View 将显示和隐藏。两个 subview 各有一个文本字段来输入数字。键盘是数字键盘。我已经为两个 subview 实现了 func touchesBeganUITapGestureRecognizer 并添加了 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 = ""
}

最佳答案

我的猜测是您以错误的方式解决了问题。我假设 Controller 应该负责关闭键盘,但您可以尝试这样的事情(最好在您的托管 View Controller 上):

yourView.endEditing(true) // boolean parameter specifies whether to force dismissal or not

endEditing(force) 应该遍历 View 层次结构并检查是否有任何事件的响应者,所以这实际上应该有效。您是否检查过您是否确实引用了正确的 View ?你能添加一些你的代码吗(请只添加必要的部分)?

我指出在托管 Controller 的 View 上调用它很重要的原因是它会遍历所有 subview 并检查是否有任何事件的响应者。

如果您有对文本字段的引用并且您确定它是哪一个,您也可以调用

yourTextField.resignFirstResponder()

我想这就是 endEditing(force) 在内部所做的,它遍历所有 subview 并在它遇到的任何文本字段上调用 ​​resignFirstResponder() 也是第一响应者。

编辑

由于 UIScrollView 会拦截手势,我会直接将点击手势识别器添加到 ScrollView 中,如下所示:

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)

}

关于ios - 如何从主视图中 ScrollView 内的 subview 中关闭 IOS Swift 中的键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34470887/

相关文章:

ios - 从 "unwindForSegue()"迁移到 "segueForUnwindingToViewController()"

ios - 在ios(iphone,ipad)中寻找一种简单的像素绘制方法

ios - 如何在没有身份验证的情况下通过主题标签检索推文?

iphone - 在 iPhone、BlackBerry、Android、WP7 上访问基于 SSL 的网站

ios - Twitter 工具包未在时间轴中显示视频

iphone - 将 UIView 层转换为 UIImage

iphone - 如何异步渲染 UIImage?

C++ 库集成到 iPhone 应用程序

Swift 3 - 如何从另一个 View 插入 TableView 单元格?

ios - 防止 UIView 在 Swift 中溢出到 SuperView 之外