gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:22:12 26 4
gpt4 key购买 nike

我在主视图的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com