如何在Swift代码中UITextfield为空时返回?

时间:2018-04-20 21:59:38

标签: ios swift uitextfield

我的问题是:当UITextField为空时,如何点击" Backspace"按钮转到上一个UITextField?我一直在努力尝试在下面的代码中执行此操作?

第二个问题:我如何才允许在UITextField中输入1个字符?

我是Swift代码的新手并且正在努力学习。任何帮助都会很棒。

我要做的是让用户能够输入6个UITextFields中的代码,并且能够点击" Backspace"任何一个UITextField上的按钮,只允许用户在每个UITextField中输入一个数字。

enter image description here

以下代码:

@objc func textFieldDidChange(textfield: UITextField) {
    let text = textfield.text!
    if text.utf16.count == 0 {
        switch textfield {
        case textField2:
            textField1.becomeFirstResponder()
            textField1.backgroundColor = UIColor.blue
            textField1.tintColor = .clear
        case textField3:
            textField2.becomeFirstResponder()
            textField2.backgroundColor = UIColor.blue
            textField2.tintColor = .clear
        case textField4:
            textField3.becomeFirstResponder()
            textField3.backgroundColor = UIColor.blue
            textField3.tintColor = .clear
        case textField5:
            textField4.becomeFirstResponder()
            textField4.backgroundColor = UIColor.blue
            textField4.tintColor = .clear
        case textField6:
            textField5.becomeFirstResponder()
            textField5.backgroundColor = UIColor.blue
            textField5.tintColor = .clear
            textField6.resignFirstResponder()
            textField6.backgroundColor = UIColor.blue
            textField6.tintColor = .clear
        default:
            break
        }
    }
    else if text.utf16.count == 1 {
        switch textfield {
        case textField1:
            textField1.backgroundColor = UIColor.black
            textField1.textColor = .white
            textField1.tintColor = .clear
            textField2.becomeFirstResponder()
            textField2.backgroundColor = UIColor.black
            textField2.textColor = .white
            textField2.tintColor = .clear
        case textField2:
            textField3.becomeFirstResponder()
            textField3.backgroundColor = UIColor.black
            textField3.textColor = .white
            textField3.tintColor = .clear
        case textField3:
            textField4.becomeFirstResponder()
            textField4.backgroundColor = UIColor.black
            textField4.textColor = .white
            textField4.tintColor = .clear
        case textField4:
            textField5.becomeFirstResponder()
            textField5.backgroundColor = UIColor.black
            textField5.textColor = .white
            textField5.tintColor = .clear
        case textField5:
            textField6.becomeFirstResponder()
            textField6.backgroundColor = UIColor.black
            textField6.textColor = .white
            textField6.tintColor = .clear
        case textField6:
            textField6.resignFirstResponder()
        default:
            break

        }
    } 
}

2 个答案:

答案 0 :(得分:2)

我只是想指出,我对iOS和Swift一般都比较新,但即使只用了几分钟的搜索,我也能找到一些提供的想法的种子我建议的解决方案。

根据您的(改进的)问题,我认为需要采用不同的方法。您真正不想使用文本组件的内容。 "为什么&#34 ;?  我在这里问你。因为他们实际上并没有为您提供您想要的功能,并且需要相当大的开销。

为此,你真正想要的是更多控制。您想知道何时按下某个键并且您想要响应它(我知道,听起来像文本组件,但是)并在发生更多扩展功能时收到通知,例如按下删除键。

经过几分钟的研究,一些反复试验,我发现UIKeyInput更符合您的要求。

它会告诉您何时插入文本,更重要的是,它会在按下删除时告诉您

额外的好处是,您可以直接过滤输入。您可以从String中取出第一个字符并忽略其余字符,或使用剩余文本自动填充以下元素。您可以执行验证(仅限数字内容)以及您可能想要做的其他事情

所以,我开始了一个非常新的项目,在故事板中为UILabel添加了UIViewController,将其绑定到源并实现了UIKeyInput协议...... < / p>

class ViewController: UIViewController {

    override var canBecomeFirstResponder: Bool {
        return true
    }

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        becomeFirstResponder()
    }

}

extension ViewController: UIKeyInput {

    var hasText: Bool {
        return true
    }

    func insertText(_ text: String) {
        print(text)
        label.text = text
    }

    func deleteBackward() {
        print("Delete backward")
    }

}

我运行了项目,当键入一个键时,标签已使用新键更新,当按下删除时,Delete backward文本已打印到控制台。

现在。你有一些选择。要使用单个UIViewController和(可能)一系列UILabel并管理其中的交互,因此在键入键时,将下一个标签显示为输入焦点(并在按下删除时) ,你回去)或者你是否创建了一系列代表每个数字的UIControl,并通过一些代表回调流程进行管理。

您可能还需要实施UITextInputTraits协议,这将允许您控制显示的键盘

您可能还想阅读Responding to Keyboard Events on iOSCustomTextInputView.swiftShowing the iOS keyboard without a text input,这些资源只是我用来与这个基本示例一起使用的一些资源。

答案 1 :(得分:1)

您可以将此扩展名用于第二个问题:

import UIKit

private var maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let length = maxLengths[self] else {
                return Int.max
            }
            return length
        }
        set {
            maxLengths[self] = newValue
            addTarget(
                self,
                action: #selector(limitLength),
                for: UIControlEvents.editingChanged
            )
        }
    }

    @objc func limitLength(textField: UITextField) {
        guard let prospectiveText = textField.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = prospectiveText.substring(to: maxCharIndex)
        selectedTextRange = selection
    }
}

将此扩展程序添加到项目中时,您可以在“属性检查器”选项卡中看到一个额外属性,并且可以设置UITextField的最大长度。