textField如何限制金额输入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了textField如何限制金额输入相关的知识,希望对你有一定的参考价值。
参考技术A 在文本框里输入金额的话,顾名思义,就是小数点之后只有两位数.我们知道textFiled 的代理 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 是对文字进行限制的.如果返回 NO, 则文字不能改变.那么就在这里动手脚.这是最开始的写法,确实可以限制文字的输入.但是在某次测试时,发现,当光标位置生改变之后,就会出问题,而且对于复制粘贴,无法控制.
所以下面改了一下思路, 使用正则表达式进行控制.
这是NSString 的分类
由于通过参数里面传来的字符串先拼接成最终的字符串,进行判断是否是 money 格式,所以也可以很好的避免,通过拷贝造成的不是字符串的问题.
如何限制字符数,同时只允许 TextField 中的字符子集?
【中文标题】如何限制字符数,同时只允许 TextField 中的字符子集?【英文标题】:How to limit the number of characters while also allowing only a subset of characters in a TextField? 【发布时间】:2020-08-10 03:48:33 【问题描述】:我一直在尝试限制我可以在 SwiftUI 中的 TextField 上输入的字符数,同时只允许数字。
我尝试了基于this和this的混合解决方案
.onReceive(Just(viewModel.myString)) newValue in
let filtered = newValue.filter "0123456789".contains($0)
if filtered != newValue
self.viewModel.myString = filtered
过滤字符以及
@Published var myString: String = ""
willSet
if newValue.count > Constants.maxLimit
myString = String(newValue.prefix(Constants.maxLimit))
限制字符数。
但是通过这种方法,我仍然可以添加多个Constants.maxLimit
并添加数字以外的字符。
如果我尝试将这两个逻辑与视图模型中的 willSet/didSet
或文本字段中的 onReceive
结合起来,则会因堆栈溢出而导致崩溃。
我还是 SwiftUI 的新手,所以我不确定自定义 Publisher 是否有助于解决我的问题。
【问题讨论】:
你不能这样做吗? :.onReceive(Just(viewModel.myString)) newValue in let filtered = newValue.filter "0123456789".contains($0) if filtered != newValue, filtered.count <= Constants.maxLimit self.viewModel.myString = filtered
【参考方案1】:
您可以简单地过滤所有整数字符并获取结果字符串的前 10 个字符。您还需要检查字符串是否为空并将值设置回零:
import SwiftUI
import Combine
struct ContentView: View
@State private var text = "0"
let maxLength = 10
var body: some View
TextField("", text: $text)
.keyboardType(.numberPad)
.onReceive(Just(text))
guard !$0.isEmpty else
self.text = "0"
return
if let value = Int($0.filter(\.isWholeNumber).prefix(maxLength))
self.text = String(value)
【讨论】:
是的,这对我有用。有没有办法将此逻辑移至视图模型?以上是关于textField如何限制金额输入的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为