Отсутствует последний символ в текстовом поле SwiftUI

#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()  } }