问题描述
使用SwiftUI更新应用的主视图时遇到问题。
struct Dog: Identifiable {
var id = UUID()
var name: String
var race: String
var age: Int
var gender: String
var sterile: Bool
var pictureURL: String
var location: String
var dogFriendly: Bool
var catFriendly: Bool
var childFriendly: Bool
var needsGarden: Bool
var isClean: Bool
}
我的目标是在 AddView.swift 中按下此按钮:
@Observedobject var viewmodel = Addviewmodel()
************** LONG UI CODE *******************
.navigationBarItems(trailing:
Button("Publish") {
viewmodel.dogs.append(Dog(name: self.name,race: races[selectedRace],age: self.age,gender: genders[selectedGender],sterile: self.issterile,pictureURL: "",location: "",dogFriendly: self.isDogFriendly,catFriendly: self.isCatFriendly,childFriendly: self.isChildFriendly,needsGarden: self.needsGarden,isClean: self.isClean))
print(viewmodel.dogs)
})
将狗添加到 Addviewmodel.swift 中的Dog数组中:
class Addviewmodel: ObservableObject {
@Published var dogs: [Dog] = []
}
,然后在CardView中显示信息:
struct CardView: View {
//MARK: - Properties
@State var dog: Dog
//MARK: - View
var body: some View {
******* LONG UI CODE ********
}
并在HomeView中显示那些CardView:
struct HomeView: View {
@Observedobject var viewmodel = Addviewmodel()
var body: some View {
ScrollView {
vstack {
ForEach(viewmodel.dogs) { dog in
CardView(dog: dog) // this doesn't work
Text(dog.name) // this doesn't work neither
}
}
}
}
}
有人可以帮我解决这个问题,并给我一些建议吗?
感谢您的慷慨帮助!
解决方法
将@State更改为@Bindig将对其进行修复。
CardView:
struct CardView: View {
//MARK: - Properties
@Binding var dog: Dog
//MARK: - View
var body: some View {
******* LONG UI CODE ********
}
,
我认为您想在console.log(JSON.stringify(request.body));
内附加Array
的{{1}}并在Dog
内显示更新的数据。因此,您只是在每个视图中分别声明了AddView
的实例。视图中的两个实例不会相互观察。为了解决这个问题,我更喜欢使用HomeView
模式。这是我的示例代码。
AddViewModel