点击另一个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) 

} 
+0

尝试调用'self.view。 endEditing(true)'在任何第二个视图控制器的视图生命周期方法中。第二个控制器上的 – Rishab

+0

我不使用UITextfield,只是UIlabel显示我的PIN – StevenTan

+0

'self.view.endEditing(true)'用于隐藏键盘。 – Rishab

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; 
    } 

} 
+0

这个技巧可能是工作,但其他事情如何isSecureTextEntry = true&placeHolder – StevenTan

+0

我可以通过提供文本欺骗placeHolder并将颜色更改为浅灰色。但是'isSecureTextEntry'如何让文字变成****? – StevenTan

+0

好吧,我错过了这个要求。你需要使用输入视图我会更新我的答案 – Saurav

实现的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) 
    }