点击另一个UITextField后自动禁用键盘
问题描述:
假设我的应用程序中有2个文本框。第一个Textfield是输入电子邮件(键盘显示),第二个Textfield是针脚(不需要显示任何键盘)。点击另一个UITextField后自动禁用键盘
当我点击第一个文本框时,键盘显示出来,接下来我按下第二个文本框(这将传递给另一个UI &控制器)来输入PIN。所以它在不同的页面上,我使用Protocol来传递控制器之间的值。
我已经实现了self.view.endEditing(true),如果我在UI中的任何位置按下以关闭键盘,此工作正常。
问题是,当我点击第一个文本域&立即轻敲第二个,而不用点击UI上的任何地方。第一个文本字段中的键盘不会自动关闭并卡在其他控制器&页面中。
那么如何禁用第二个textview的键盘。因为我最终不需要它。
这里有几个代码。
此代码是当我编辑第二个文本字段自动目标到另一个控制器。
//Implement UITextFieldDelegate
extension LoginViewController: UITextFieldDelegate{
func textFieldDidBeginEditing(_ textField: UITextField) {
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "EnterMpinViewController") as! EnterMpinViewController
secondViewController.pinProtocol = self
textField.resignFirstResponder()
self.navigationController?.pushViewController(secondViewController, animated: true)
}
答
TextField具有用于自定义输入的InputView属性,对于此方案而言,它应该是理想的,因为您还需要安全输入pin。
我已经写下面的代码片段来展示如何使用输入视图。
UIKit框架包括用于定制输入视图和输入 附件视图的支持。当用户在视图中编辑文本或其他形式的数据时,您的应用可以将其自己的输入视图替换为系统键盘 。例如,应用程序可以使用自定义输入视图从符文字母表输入字符 。
import UIKit
class ViewController: UIViewController {
var textField: UITextField?
override func viewDidLoad() {
super.viewDidLoad()
textField = UITextField()
textField?.isSecureTextEntry = true
textField?.textColor = UIColor.blue
textField?.frame = CGRect.init(x: 10, y: 100, width: 200, height: 200)
view.addSubview(textField!)
textField?.inputView = view
textField?.reloadInputViews()
let btn1: UIButton = UIButton()
btn1.frame = CGRect.init(x: 10, y: 350, width: 40, height: 40)
btn1.setTitle("1", for: UIControlState.normal)
btn1.addTarget(self, action: #selector(btn1Tap), for: UIControlEvents.touchUpInside)
view.addSubview(btn1)
view.backgroundColor = UIColor.lightGray
}
func btn1Tap(btn1: UIButton) {
textField?.text = btn1.currentTitle;
}
}
答
实现的UITextField委托方法,并返回false,如果文本框是你的另一个文本框
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == yourAnotherTextFiled {
return false
}
return true
}
答
尝试这种方式可以帮助你
let when = DispatchTime.now() + 2 // change 2 to desired number of seconds
self.view.endEditing(true)
DispatchQueue.main.asyncAfter(deadline: when) {
// Your code with delay
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "EnterMpinViewController") as! EnterMpinViewController
secondViewController.pinProtocol = self
self.navigationController?.pushViewController(secondViewController, animated: true)
}
尝试调用'self.view。 endEditing(true)'在任何第二个视图控制器的视图生命周期方法中。第二个控制器上的 – Rishab
我不使用UITextfield,只是UIlabel显示我的PIN – StevenTan
'self.view.endEditing(true)'用于隐藏键盘。 – Rishab