У меня есть представление, и я хочу загрузить данные из базы данных с начала представления, потому что я хочу отредактировать профиль своего пользователя.
Поэтому всякий раз, когда я запускаю свое представление, данные будут загружаться.
Это мой код, но он дает мне исключение для TextField.
struct ProfileView: View {
@State var myUser = User()
var repo = myRepo()
var body: some View {
VStack{
Form{
Section(header: Text("edit the name")){
TextField("Nume produs", text: self.myUser.name) //IT DOES NOT WORK HERE
}
}
}.onAppear(){
getMyUser()
}
func getMyUser(){
Task{
do{
try await repo.getUserProfile().watch(block: {item in
self.myUser = item as! User
})
}catch{
print("error")
}
}
}
}
Это просто не работает, когда я помещаю текстовое поле Каков наилучший способ получить данные моего объекта (myUser) сразу в начале представления?
вы пробовали использовать TextField("Nume produs", text: $myUser.name)
, обратите внимание на $
. У вас должен быть Binding<String>
вместо TextField text
. Какая у вас ошибка? Также покажите код для User
да, я пробовал с $, и он тоже ломается, когда я открываю вид, исключение: Thread 1: EXC_BAD_ACCESS (code=1
Я думаю, это потому, что текстовое поле ожидает получить значение сразу, но его нет в начале, а затем оно ломается, я прав?
@loremipsum, как мне добавить это в свой собственный код?
В своем User
, который вы не показываете, используйте var name: String = ""
, тогда, как вы говорите, в нем что-то будет на старте. Обратите внимание, что вам все еще нужно использовать TextField("Nume produs", text: $myUser.name)
с $
Я добавил это, и мое поле - имя var: String = "", как вы сказали, но оно все равно прерывается с этим исключением
У меня недостаточно информации, чтобы исправить код, но вам нужно преобразовать «наблюдение» в параллельный тип. Замыкания просто не имеют возможности «удерживать свое место» в акторе, задача будет завершена, потому что она не знает, когда ждать/возвратиться. Посмотрите «Знакомство с async/await», чтобы узнать, как это работает.
Просто запустите String
как пустое и создайте @Binding
вот так:
import SwiftUI
struct ProfileView: View {
@State var myUser = ""
var body: some View {
VStack{
Form{
Section(header: Text("edit the name")){
TextField("Nume produs", text: $myUser) //IT DOES NOT WORK HERE
}
}
}.onAppear(){
getMyUser()
}
}
func getMyUser() {
Task{
do{
try await Task.sleep(nanoseconds: 3_000_000_000)
myUser = "HELLO"
}catch{
print("error")
}
}
}
}
Вы не можете получить его сразу, вы можете справиться с задержкой, показывая
ProgressView
во время загрузки или отключения, или показывая какую-то другую анимацию.