#swift #swiftui
Вопрос:
Я только что столкнулся с довольно неудобной проблемой при использовании текстового поля() в SwiftUI. Все, что я пытаюсь сделать, это передать данные из текстового поля в класс (помеченный @ObservableObject). В этом классе есть функция displayData (), которая просто выводит данные, переданные текстовым полем. Я бы сказал, что в 70% случаев последний символ строки отсутствует. Что меня здесь беспокоит, так это то, что это происходит не все время. Из-за этого довольно трудно это понять.
Чтобы привести вам пример, если я наберу 1234, скажем, в первом текстовом поле (), print(self.username) вернет 123. Когда я пытаюсь добавить вторую 4, она выводит 12344.
Эта проблема возникает как в текстовом поле (), так и в защищенном поле ().
Вот что происходит в представлении содержимого
TextField("Enter your username here.", text: self.$dataManager.username) .padding() SecureField("Enter your password here.", text: self.$dataManager.password) .padding() Spacer() Button(action: { self.dataManager.displayData() }, label: { Text("Send Data") }).padding() Spacer()
И в классе:
var username: String = "" var password: String = "" func displayData(){ print("USERNAME: (self.username), PASSWORD: (self.password)") }
Большое спасибо!
Комментарии:
1. Создает ли это представление этот
dataManager
экземпляр или оно создано в другом месте?
Ответ №1:
Для того, чтобы ваши username
и password
свойства правильно привязывались к вашим полям, вам необходимо аннотировать их @Published
в своем ObservableObject
.
Следующая версия работает и не страдает от проблем, о которых вы упомянули:
class ViewModel : ObservableObject { @Published var username = "" @Published var password = "" func displayData(){ print("USERNAME: (self.username), PASSWORD: (self.password)") } } struct ContentView : View { @StateObject var dataManager = ViewModel() var body: some View { TextField("Enter your username here.", text: self.$dataManager.username) .padding() SecureField("Enter your password here.", text: self.$dataManager.password) .padding() Spacer() Button(action: { self.dataManager.displayData() }, label: { Text("Send Data") }).padding() Spacer() } }