微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI-尽管使用@Published和@ObservedObject

如何解决SwiftUI-尽管使用@Published和@ObservedObject

使用SwiftUI更新应用的主视图时遇到问题。

所以,我有一个Dog结构( Dog.swift ):

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。