根据输入的字符限制 textField 长度?
Limiting textField length depending on what characters are entered into it?
我有一个将长度限制为 3 的文本字段函数。这两个文本字段之一允许使用减号“-”。
如果我用数字键盘输入数字,它们会停在 3 个字符处。
如果我输入后面带数字的“-”,它们会停在 3 个字符处。
但是,
如果我只输入“-”,它们会持续的时间比我愿意承认的要长。
因此,如果我组合字符集以包括十进制数字和减号出现的任何设置----这是否允许我将文本字段限制为“单个”减号和最多 3 个数字?
对于未签名的文本字段,您可以使用此 post 中显示的相同方法。因为您还需要做一些更改以允许负输入。首先添加一个工具栏以允许用户切换 positive/negative 输入并使用范围而不是最大值。您无需检查用户输入了多少位数字,只需确保输入的值包含在该范围内即可。要允许用户使用 return 键完成对字段的编辑,您可以将该字段作为其委托并实现 textFieldShouldReturn 方法。最后但并非最不重要的一点是,在过滤数字时,请确保不要删除出现的减号前缀:
您的 SignedIntegerField 应如下所示:
import UIKit
class SignedIntegerField: UITextField, UITextFieldDelegate {
var value: Int { string.digits.integer ?? 0 }
var range = -999...999
private var lastValue: Int = 0
override func willMove(toSuperview newSuperview: UIView?) {
precondition(range ~= 0)
delegate = self
addToolbar()
addTarget(self, action: #selector(editindDidEnd), for: .editingDidEnd)
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
keyboardType = .numberPad
textAlignment = .right
sendActions(for: .editingChanged)
}
func addToolbar() {
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.barStyle = .default
toolbar.items = [
.init(title: "+/-",
style: .plain,
target: self,
action: #selector(minusAction)),
.init(barButtonSystemItem: .flexibleSpace,
target: self,
action: nil),
.init(title: "Clear",
style: .plain,
target: self,
action: #selector(clearAction)),
.init(barButtonSystemItem: .flexibleSpace,
target: self, action: nil),
.init(title: "Done",
style: .plain,
target: self,
action: #selector(doneAction))]
inputAccessoryView = toolbar
}
@objc func minusAction() {
if text!.hasPrefix("-") {
text!.removeFirst()
} else {
text!.insert("-", at: text!.startIndex)
}
}
@objc func clearAction() { text = "0" }
@objc func doneAction() {
if text == "-" { text = "0" }
resignFirstResponder()
}
override func deleteBackward() {
text!.remove(at: text!.index(before: text!.endIndex))
sendActions(for: .editingChanged)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
resignFirstResponder()
return true
}
@objc func editingChanged() {
guard range ~= value else {
text = Formatter.decimal.string(for: lastValue)
return
}
text = Formatter.decimal.string(for: value)
print("Value:", value)
lastValue = value
}
@objc func editindDidEnd() {
if text == "-" { text = "0" }
}
}
fileprivate extension UITextField {
var string: String { text ?? "" }
}
fileprivate extension Formatter {
static let decimal = NumberFormatter(numberStyle: .decimal)
}
fileprivate extension NumberFormatter {
convenience init(numberStyle: Style) {
self.init()
self.numberStyle = numberStyle
}
}
fileprivate extension StringProtocol where Self: RangeReplaceableCollection {
var digits: Self {
first == "-" ?
"-" + dropFirst().filter("0123456789".contains) :
filter("0123456789".contains)
}
var integer: Int? { Int(self) }
}
谢谢你所做的一切!
我已经制作了一个工具栏,不想更改我的工作内容。
因此,我的文本字段受范围限制,具体取决于它是哪个字段。
无符号的长度限制为3。
符号的长度为 4---只有在有“-”的情况下。
它(再次)不是“最快的”,但我成功了:
var maxLength = 3 //checks to allow 3 digits in per1k and 4 digits in fecocollector
if (textField == fecoCollector) && fecoCollector.text!.contains("-") {
maxLength = 4
} else {
maxLength = 3
}
和
我在工具栏上的按钮(我制作的负号按钮)将其作为选择器运行...最后调用主要数学函数。
@objc func preloadTheMinus() {
let char: Character = "-" //something to compare against
let fecoCollectorFilter = fecoCollector.text!
minusCount = fecoCollectorFilter.filter { [=11=] == char }.count //count the -'s
print("fecoCollector has \(minusCount) minus in it")
if fecoCollector.text!.hasPrefix("-") {
fecoCollector.text!.removeFirst()
} else {
fecoCollector.text!.insert("-", at: fecoCollector.text!.startIndex)
}
doTheRemainingMath()
}
我有一个将长度限制为 3 的文本字段函数。这两个文本字段之一允许使用减号“-”。
如果我用数字键盘输入数字,它们会停在 3 个字符处。
如果我输入后面带数字的“-”,它们会停在 3 个字符处。
但是,
如果我只输入“-”,它们会持续的时间比我愿意承认的要长。
因此,如果我组合字符集以包括十进制数字和减号出现的任何设置----这是否允许我将文本字段限制为“单个”减号和最多 3 个数字?
对于未签名的文本字段,您可以使用此 post 中显示的相同方法。因为您还需要做一些更改以允许负输入。首先添加一个工具栏以允许用户切换 positive/negative 输入并使用范围而不是最大值。您无需检查用户输入了多少位数字,只需确保输入的值包含在该范围内即可。要允许用户使用 return 键完成对字段的编辑,您可以将该字段作为其委托并实现 textFieldShouldReturn 方法。最后但并非最不重要的一点是,在过滤数字时,请确保不要删除出现的减号前缀:
您的 SignedIntegerField 应如下所示:
import UIKit
class SignedIntegerField: UITextField, UITextFieldDelegate {
var value: Int { string.digits.integer ?? 0 }
var range = -999...999
private var lastValue: Int = 0
override func willMove(toSuperview newSuperview: UIView?) {
precondition(range ~= 0)
delegate = self
addToolbar()
addTarget(self, action: #selector(editindDidEnd), for: .editingDidEnd)
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
keyboardType = .numberPad
textAlignment = .right
sendActions(for: .editingChanged)
}
func addToolbar() {
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.barStyle = .default
toolbar.items = [
.init(title: "+/-",
style: .plain,
target: self,
action: #selector(minusAction)),
.init(barButtonSystemItem: .flexibleSpace,
target: self,
action: nil),
.init(title: "Clear",
style: .plain,
target: self,
action: #selector(clearAction)),
.init(barButtonSystemItem: .flexibleSpace,
target: self, action: nil),
.init(title: "Done",
style: .plain,
target: self,
action: #selector(doneAction))]
inputAccessoryView = toolbar
}
@objc func minusAction() {
if text!.hasPrefix("-") {
text!.removeFirst()
} else {
text!.insert("-", at: text!.startIndex)
}
}
@objc func clearAction() { text = "0" }
@objc func doneAction() {
if text == "-" { text = "0" }
resignFirstResponder()
}
override func deleteBackward() {
text!.remove(at: text!.index(before: text!.endIndex))
sendActions(for: .editingChanged)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
resignFirstResponder()
return true
}
@objc func editingChanged() {
guard range ~= value else {
text = Formatter.decimal.string(for: lastValue)
return
}
text = Formatter.decimal.string(for: value)
print("Value:", value)
lastValue = value
}
@objc func editindDidEnd() {
if text == "-" { text = "0" }
}
}
fileprivate extension UITextField {
var string: String { text ?? "" }
}
fileprivate extension Formatter {
static let decimal = NumberFormatter(numberStyle: .decimal)
}
fileprivate extension NumberFormatter {
convenience init(numberStyle: Style) {
self.init()
self.numberStyle = numberStyle
}
}
fileprivate extension StringProtocol where Self: RangeReplaceableCollection {
var digits: Self {
first == "-" ?
"-" + dropFirst().filter("0123456789".contains) :
filter("0123456789".contains)
}
var integer: Int? { Int(self) }
}
谢谢你所做的一切!
我已经制作了一个工具栏,不想更改我的工作内容。
因此,我的文本字段受范围限制,具体取决于它是哪个字段。
无符号的长度限制为3。 符号的长度为 4---只有在有“-”的情况下。
它(再次)不是“最快的”,但我成功了:
var maxLength = 3 //checks to allow 3 digits in per1k and 4 digits in fecocollector
if (textField == fecoCollector) && fecoCollector.text!.contains("-") {
maxLength = 4
} else {
maxLength = 3
}
和
我在工具栏上的按钮(我制作的负号按钮)将其作为选择器运行...最后调用主要数学函数。
@objc func preloadTheMinus() {
let char: Character = "-" //something to compare against
let fecoCollectorFilter = fecoCollector.text!
minusCount = fecoCollectorFilter.filter { [=11=] == char }.count //count the -'s
print("fecoCollector has \(minusCount) minus in it")
if fecoCollector.text!.hasPrefix("-") {
fecoCollector.text!.removeFirst()
} else {
fecoCollector.text!.insert("-", at: fecoCollector.text!.startIndex)
}
doTheRemainingMath()
}