[英]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.