我的问题是:当UITextField为空时,如何点击" Backspace"按钮转到上一个UITextField?我一直在努力尝试在下面的代码中执行此操作?
第二个问题:我如何才允许在UITextField中输入1个字符?
我是Swift代码的新手并且正在努力学习。任何帮助都会很棒。
我要做的是让用户能够输入6个UITextFields中的代码,并且能够点击" Backspace"任何一个UITextField上的按钮,只允许用户在每个UITextField中输入一个数字。
以下代码:
@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
}
}
}
答案 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 iOS,CustomTextInputView.swift和Showing 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
的最大长度。