【问题标题】:How could I enable / disable keyboard Return Key manually in Swift?如何在 Swift 中手动启用/禁用键盘返回键?
【发布时间】:2016-05-22 20:57:27
【问题描述】:

此问题与以下不重复:

我有两个TextFields

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
  • textField1 具有 下一步 按钮,如返回键;

  • textField2 具有 Go 按钮,例如 Return 键;

textField1

textField2

如果两个 TextField 都不为空,我想启用第二个 TextField 的 Go 按钮。

我尝试将someTextField.enablesReturnKeyAutomaticallyTextFieldDelegate 一起使用,但没有成功。

感谢您的帮助。

【问题讨论】:

  • 你如何将textField1:s 的下一个响应者设置为textField2?(之前的有“下一个”而不是“返回”)。只是textField1.returnKeyType = UIReturnKeyType.Next?
  • 是的,我认为这很棘手(例如:textField1 为空但textField2 不是:Go 按钮将被启用)。我已经看到了一些未记录的 obj-c hack,用于将返回按钮设置为启用/禁用,但我无法让它们快速适应。此外,我们希望避免未记录的黑客行为。请参阅[此线程]。
  • 好的,这是我下面的最后一次尝试,我现在需要睡觉了。只要第一个文本视图为空,此最终版本就会禁用第二个文本视图。此后,在第二个文本视图中禁用“开始”按钮,只要它是空的。
  • 我试过这样做,但我发现这对用户体验不好。
  • 我同意这有点难看。可能你最好的解决方案是使用enablesReturnKeyAutomatically 来单独检查每个textFieldX 中的空输入,包括一些运行时检查,如果在Go 被按下而textField1 被按下时会产生警告(并中止一些操作)是空的。

标签: ios swift keyboard uitextfield


【解决方案1】:

以下:只要textField1 为空,textField2 就会被禁用。如果后者非空,我们启用textField2,但仅当textField2 非空时才启用Go 按钮(通过.enablesReturnKeyAutomatically 属性),

/* ViewController.swift */
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // text field delegates
        textField1.delegate = self
        textField2.delegate = self

        // set return key styles
        textField1.returnKeyType = UIReturnKeyType.Next
        textField2.returnKeyType = UIReturnKeyType.Go

        // only enable textField2 if textField1 is non-empty
        textField2.enabled = false

        // only enable 'go' key of textField2 if the field itself is non-empty
        textField2.enablesReturnKeyAutomatically = true
    }

    // UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if (textField1.text?.isEmpty ?? true) {
            textField2.enabled = false
            textField.resignFirstResponder()
        }
        else if textField == textField1 {
            textField2.enabled = true
            textField2.becomeFirstResponder()
        }
        else {
            textField.resignFirstResponder()
        }

        return true
    }
}

运行如下:

【讨论】:

  • 有没有办法根据输入的长度来做到这一点?也就是说,我们需要超过 10 个字符才能点击下一个。
【解决方案2】:
class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField1.delegate = self
        textField2.delegate = self
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField === textField2 {
            setReturnKeyState(for: textField, isEnabled: shoulEnableReturnKey(), delay: 0.1) // A bit hacky it needs delay here
        }
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField === textField2 {
            if var text = textField.text, let range = Range(range, in: text) {
                text.replaceSubrange(range, with: string)
                setReturnKeyState(for: textField, isEnabled: shoulEnableReturnKey())
            }
        }
        return true
    }
    
    private func shoulEnableReturnKey() -> Bool {
        textField1.hasText && textField2.hasText
    }
}
   
extension UITextFieldDelegate {
    func setReturnKeyState(for textField: UITextField, isEnabled: Bool, delay: Double? = nil) {
        textField.enablesReturnKeyAutomatically = false
        if textField.delegate != nil {
            if let delay = delay {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
                    textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
                }
            } else {
                textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2012-02-24
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2015-05-17
    相关资源
    最近更新 更多