因此,我想在更新TextField的值后更改光标位置(输入掩码为“ +7 000 000 00 00”)。
我有TextField:
TextField("+7 000 000 00 00", text: $loginChecker.login)
.textContentType(.telephoneNumber)
.keyboardType(.numberPad)
.disableAutocorrection(true)
.textFieldStyle(BasicTextField())
和要检查的类:
class LoginChecker: ObservableObject {
var full = false
var login = "" {
willSet {
if newValue.count > 16 {
self.full = true
} else {
self.full = false
}
}
didSet {
if self.full {
self.login = oldValue
} else {
self.login = self.phoneFormatter()
}
self.objectWillChange.send()
}
}
func phoneFormatter () -> String {
let numbers = onlyNumbers(self.login)
var newValue = numbers.first == "7" ? String(numbers.dropFirst()) : numbers
if numbers.count > 0 {
newValue.insert("+", at: newValue.startIndex)
newValue.insert("7", at: newValue.index(newValue.startIndex, offsetBy: 1))
newValue.insert(" ", at: newValue.index(newValue.startIndex, offsetBy: 2))
if numbers.count > 4 {
newValue.insert(" ", at: newValue.index(newValue.startIndex, offsetBy: 6))
if numbers.count > 7 {
newValue.insert(" ", at: newValue.index(newValue.startIndex, offsetBy: 10))
if numbers.count > 9 {
newValue.insert(" ", at: newValue.index(newValue.startIndex, offsetBy: 13))
}
}
}
}
return newValue
}
}
当我更新TextField的值时,光标不会改变位置。
屏幕截图:
答案 0 :(得分:0)
反应迟了一点。当我查看您的“ ObservableObject”(即“ LoginChecker”)时,我注意到您尚未发布任何内容。
ObservableObject
项发生更改时,SwiftUI
会将事件发布到Published
,而您没有任何项。
进行以下更改:
@Published var login = "" {
// This can stay the same
}
有了这个,您应该能够完成这项工作。