如何解决如何设置SwiftUI的文本字段字符限制?
我正在使用SwiftUi版本2进行应用程序开发。我遇到了SwiftUI中可用的文本字段的问题。我不想再使用UITextField。我想限制TextField中的字符数。我进行了很多搜索,发现了一些与此相关的答案,但这些答案不适用于SwiftUI版本2。
class textBindingManager: ObservableObject{
let characterLimit: Int
@Published var phoneNumber = "" {
didSet {
if phoneNumber.count > characterLimit && oldValue.count <= characterLimit {
phoneNumber = oldValue
}
}
}
init(limit: Int = 10) {
characterLimit = limit
}
}
struct ContentView: View {
@ObservedObject var textBindingManager = TextBindingManager(limit: 5)
var body: some View {
TextField("Placeholder",text: $textBindingManager.phoneNumber)
}
}
解决方法
无需在已发布的媒体资源上使用didSet。您可以在TextField中添加修饰符,并将字符串值限制为其前缀(限制为字符数):
import SwiftUI
struct ContentView: View {
@ObservedObject var textBindingManager = TextBindingManager(limit: 5)
var body: some View {
TextField("Placeholder",text: $textBindingManager.phoneNumber)
.padding()
.onChange(of: textBindingManager.phoneNumber,perform: editingChanged)
}
func editingChanged(_ value: String) {
textBindingManager.phoneNumber = String(value.prefix(textBindingManager.characterLimit))
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class TextBindingManager: ObservableObject {
let characterLimit: Int
@Published var phoneNumber = ""
init(limit: Int = 10){
characterLimit = limit
}
}
,
此解决方案将所有内容包装在一个新的组件中。您可以将其改编为非常轻松地执行其他解析/模式检查。
struct ContentView : View {
@State private var myTextValue: String = ""
var body: some View {
LimitedTextField(value: $myTextValue,charLimit: 2)
}
}
struct LimitedTextField : View {
@State private var enteredString: String = ""
@Binding var underlyingString: String
let charLimit : Int
init(value: Binding<String>,charLimit: Int) {
_underlyingString = value
self.charLimit = charLimit
}
var body: some View {
HStack {
TextField("",text: $enteredString,onCommit: updateUnderlyingValue)
.onAppear(perform: { updateEnteredString(newUnderlyingString: underlyingString) })
.onChange(of: enteredString,perform: updateUndelyingString)
.onChange(of: underlyingString,perform: updateEnteredString)
}
}
func updateEnteredString(newUnderlyingString: String) {
enteredString = String(newUnderlyingString.prefix(charLimit))
}
func updateUndelyingString(newEnteredString: String) {
if newEnteredString.count > charLimit {
self.enteredString = String(newEnteredString.prefix(charLimit))
underlyingString = self.enteredString
}
}
func updateUnderlyingValue() {
underlyingString = enteredString
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。