点击另一个 UITextField 后自动禁用键盘

Posted

技术标签:

【中文标题】点击另一个 UITextField 后自动禁用键盘【英文标题】:Disable keyboard automatically after tap on another UITextField 【发布时间】:2017-10-27 02:10:15 【问题描述】:

假设我的应用中有 2 个文本字段。第一个文本字段用于输入电子邮件(键盘显示),第二个文本字段用于 pin(无需显示键盘)。

当我点击第一个文本字段时,键盘出现,然后我按下第二个文本字段(这将传递给另一个 UI 和控制器)以输入 PIN。所以它在不同的页面上,我使用协议在控制器之间传递值。

我已经实现了 self.view.endEditing(true) 并且如果我按下 UI 中的任意位置以关闭键盘,这将正常工作。

问题是,当我点击第一个文本字段并立即点击第二个而不点击 UI 上的任何地方。第一个文本字段的键盘不会自动关闭并卡在另一个控制器和页面中。

那么如何禁用第二个文本视图的键盘。因为我最终不需要它。

这里的代码很少。

此代码是当我编辑第二个文本字段时自动定位到另一个控制器。

//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)


【问题讨论】:

尝试在第二个视图控制器的视图生命周期方法中调用self.view.endEditing(true) 在第二个控制器上我不使用 UITextfield,只是 UIlabel 来显示我的 pin self.view.endEditing(true) 用于隐藏键盘。 【参考方案1】:

实现 UITextField 委托方法,如果 textfield 是您的另一个文本字段,则返回 false

 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
        if textField == yourAnotherTextFiled 

            return false
        
        return true
    

【讨论】:

【参考方案2】:

试试这个方法对你有帮助

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)
    

【讨论】:

【参考方案3】:

TextField 具有用于自定义输入的 InputView 属性,这对于这种情况来说应该是理想的,因为您还需要安全输入 pin。

我在下面编写了代码 sn-p 来展示如何使用输入视图。

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;
    


【讨论】:

这个技巧可能会奏效,但是像 isSecureTextEntry = true & placeHolder 这样的其他方法呢 我可以通过提供文本来欺骗 placeHolder 并将颜色更改为浅灰色。但是isSecureTextEntry 让文本变成 **** 怎么样? 好吧,我错过了这个要求。您需要使用输入视图我会更新我的答案 我必须使用按钮来声明这个? 你一定用对了吗?您如何从数字中获取信息?

以上是关于点击另一个 UITextField 后自动禁用键盘的主要内容,如果未能解决你的问题,请参考以下文章

当点击另一个 UITextField 时键盘不会关闭,这会带来一个选择器

swift 点击Textfield 后自动上移,避免键盘被遮住

WPF 禁用TextBox的触摸后自动弹出虚拟键盘

WPF 禁用TextBox的触摸后自动弹出虚拟键盘

在UITextfield中输入文本后以编程方式更改焦点

Swift:无法让 UITextField 关闭键盘