繁体   English   中英

如何关闭具有多个UITextField的键盘

[英]How to dismiss keyboard with multiple UITextField

我在这里和iOS世界都是菜鸟。 在我非常简单的待办事项列表iOS应用中,在特定情况下无法关闭键盘。

我希望当用户点击当前文本字段或键盘本身之外的任何位置时,键盘会被关闭。 到目前为止,当用户点击UITableView或我的应用程序中的大多数元素时,我得到的键盘关闭效果很好(这是由于堆栈溢出导致的)。 但是当用户点击另一个UITextField时,键盘不会消失

仅供参考,以下是我到目前为止研究的现有线程列表,但尚未解决此问题。 1) 如何以编程方式关闭iOS键盘 2) 退出多个UITextField 的第一响应者 3) 退出具有多个文本字段的第一响应者/键盘 4)(至少还有一些,但我失去了音轨:()

这是我到目前为止所做的:

(in viewDidLoad())
// Add 'tap' gesture to dismiss keyboard when done adding/editing to-do item
var tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapOutside:")
tap.cancelsTouchesInView = true
self.view.addGestureRecognizer(tap)

func tapOutside(tapOutside: UIGestureRecognizer) {
   // Dismiss keyboard
   self.view.endEditing(true)
}

@IBAction func EditingDidBegin(sender: UITextField) {
   // Highlight the text field which user is editing
   self.highlightTextField(sender, highlight: true)
}

@IBAction func EditingDidEnd(sender: UITextField) {
   // Undo text field highlight
   self.highlightTextField(sender, highlight: false)

   self.view.endEditing(true)  // try this option and not working
   self.setEditing(false, animated: true)   // try this option and not working
   sender.resignFirstResponder()   // try this option and not working
   UIApplication.sharedApplication().becomeFirstResponder()   // try this option and not working

   ... // below is my code to update the todo item
}

我还尝试打印出我视图的所有subviews.isFirstResponder()。 全部返回false。 我还尝试了重写UIViewController的touchesBegan,并在其内部仅调用self.view.endEditing(true)并调用其超级对象。 这也不起作用。

请帮忙。 :(

TIA!

更新:你们真棒! :DI现在可以正常工作了,谢谢你们。 在学习新框架时,出现了一些错误/一团糟。 这就是我所做的。

1)我没有正确设置UITextField委托。 错误:我在xcode中使用ctrl拖动文本字段,并将viewController作为委托链接,并认为应该可以解决。 我仍然需要研究并更好地理解原因。 解决方案:我删除了该ctrl拖动链接,并在tableView:cellForRowAtIndexPath中显式调用myTextField.delegate = self。 做到了。 谢谢@Sidewalker

2)错误:我混合了textFieldShouldBeginEditing等和@IBAction函数EditingDidBegin。 因此,我陷入了textFieldShouldBeginEditing接到电话但EditingDidBegin没有接到电话的情况。 解决方案:一旦我明确设置了委托= self并坚持实现textField ...方法,并且不对textField使用任何@IBAction,事情就可以了。

嗯,键盘并没有消失,因为它不需要这样做。 新的UITextField刚成为第一个响应者,其他人都辞职了。 如果您不想让textField成为第一个响应者(如果已经有另一个响应者),则必须先将其切断,然后才能获得机会。 我会尝试实现textFieldShouldBeginEditing并弄清楚那里的逻辑。

我不喜欢这种外观,但是应该遵循这些原则。

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    for subView in self.view.subviews{
        if(subView.isKindOfClass(UITextField)){
            if(subView.isFirstResponder()){
                subView.resignFirstResponder();
                return false;
            }
        }
    }
    return true;
}

这是一个选项...我们将添加一个布尔标志,以确定在尝试对另一个textField进行编辑时是否在textField中

使您的类遵守UITextFieldDelegate

class MyClass: UIViewController, UITextFieldDelegate

不要忘记设置委托,我们还将添加标志

myTextField.delegate = self
var inField = false

实现“ textFieldShouldBeginEditing”和“ textFieldDidBeginEditing”

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    if inField {
        inField = false
        return false
    } 
    return true
}

func textFieldDidBeginEditing(textField: UITextField) {
    inField = true
}

我更喜欢跟踪这样的事情,而不是标识子视图,因为它允许将该标志用于其他地方并降低代码复杂性。

首先将所有UITextField(您正在创建的)委托设置为self,并创建一个UITextField成员变量。 现在实现“ textFieldDidBeginEditing”委托方法,并将文本字段分配给您的成员UITextField变量。 如下

func textFieldDidBeginEditing(textField: UITextField) {
    yourMemberVariable = textField;
}

因此,现在每当您要关闭键盘时,请在“ yourMemberVariable”对象上调用dismiss方法。 它应该工作!

我通常要做的是实现这两种方法:

第一个将UITapGestureRecognizer添加到整个UIViewController视图

func hideKeyboard() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    view.addGestureRecognizer(tap)
}

每当用户触摸UIViewController视图上的任何位置时,第二个方法都会被调用

func dismissKeyboard() {
    self.view.resignFirstResponder()
}

我将第一个添加到UIViewController的viewDidLoad方法中。 更好的是,如果您想在所有应用程序上使用它,只需对UIViewController进行扩展即可。

在viewController中如何做,对我有用

func dismissKeyboard() {
    //All the textFields in the form
    let textFields = [textField1, textField2, textField3, textField4, textField5]
    let firstResponder = textFields.first(where: {$0.isFirstResponder ?? false })
    firstResponder?.resignFirstResponder()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM