点击另一个 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 时键盘不会关闭,这会带来一个选择器