Я пытаюсь проверить пользовательский ввод в TextField, удалив определенные символы с помощью регулярного выражения. К сожалению, у меня проблемы с методом didSet text
var, вызывающим себя рекурсивно.
import SwiftUI
import Combine
class TextValidator: ObservableObject {
@Published var text = "" {
didSet {
print("didSet")
text = text.replacingOccurrences(
of: "\\W", with: "", options: .regularExpression
) // `\W` is an escape sequence that matches non-word characters.
}
}
}
struct ContentView: View {
@ObservedObject var textValidator = TextValidator()
var body: some View {
TextField("Type Here", text: $textValidator.text)
.padding(.horizontal, 20.0)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}
В swift docs (см. Структуру AudioChannel) Apple предоставляет пример, в котором свойство переназначается в своем собственном методе didSet, и явно отмечает, что это не вызвать метод didSet для повторного вызова. Я провел некоторое тестирование на детской площадке и подтвердил это поведение. Однако, кажется, что все работает по-разному, когда я использую переменные ObservableObject
и Published
.
Как я могу предотвратить рекурсивный вызов метода didSet?
Я попробовал примеры в этом посте , но ни один из них не сработал. С тех пор Apple могла что-то изменить, так что этот пост НЕ является его копией.
Кроме того, возвращение текста к oldValue
в методе didSet
при обнаружении недопустимых символов будет означать, что если пользователь вставляет текст, тогда весь текст будет удален, в отличие от удаления только недопустимых символов. Так что эта опция не будет работать.