【问题标题】:Disable keyboard automatically after tap on another UITextField点击另一个 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) 用于隐藏键盘。

标签: ios swift swift3 uikeyboard


【解决方案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 让文本变成 **** 怎么样?
      • 好吧,我错过了这个要求。您需要使用输入视图我会更新我的答案
      • 我必须使用按钮来声明这个?
      • 你一定用对了吗?您如何从数字中获取信息?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多