正在尝试动态更新swiftUI视图


struct MakeVideo: View {

@EnvironmentObject var modelData: ModelData
@State private var chosenFriends: [FriendModel] = []

mutating func addFriend(_friend: FriendModel) -> Void {
chosenFriends.append(_friend)

}

var body: some View {
VStack {
ForEach(modelData.friends) { friend in
HStack {
ProfilePic(picture: friend.profilepic!)
Text("@"+friend.username!)

//TODO: This is updating the val, it just isn't being shown here

Button("Add", action: friend.toggleChosen)

if friend.isChosen {
Image(systemName: "star.fill")
.foregroundColor(.yellow)
} else {
Image(systemName: "star")
}

}
}
}
}
}
struct MakeVideo_Previews: PreviewProvider {
static var previews: some View {
MakeVideo()
.environmentObject(ModelData())
}
}

我正在尝试动态更新这一点,这样当ai点击按钮时,它会使星号被填充,而不是空的。在调试器中,我看到类值被更改,但是更改不会出现在视图中。我还在类@Published中创建了var,我认为这将允许视图随值而更改

这是我的类和ModelData 代码

class FriendModel: Identifiable, ObservableObject {

init(id: Int, username: String, profilepic: String) {
self.id = id
self.username = username
self.profilepic = profilepic
}

var id: Int?
var username: String?
var profilepic: String?
@Published var isChosen = false
//var profilepic: UIImage

func toggleChosen() {
print(self.isChosen)
self.isChosen = !self.isChosen
print(self.isChosen)
}
}
var allvideos: [VideoModel] = [VideoModel(id: 1, name: "Beach Trip", length: 25, url: "mona"), VideoModel(id: 2, name: "Dogs", length: 10, url:"dog"), VideoModel(id: 3, name: "Concerts", length: 42, url: "hogrider")]
var allfriends: [FriendModel] = [FriendModel(id: 1, username: "bpaul18", profilepic: "profilepic"), FriendModel(id: 2, username: "kmill", profilepic: "profilepic"), FriendModel(id: 3, username: "dudeitsdom", profilepic: "profilepic")]
final class ModelData: ObservableObject {
@Published var videos: [VideoModel] = allvideos
@Published var friends: [FriendModel] = allfriends
}

您并没有说您在以下行中遇到编译器错误:

Button("Add", action: friend.toggleChosen)

因此,我推断FriendModelclass,而不是struct。如果FriendModelstruct,而toggleChosenmutating方法,那么您将得到一个错误:"无法对不可变值使用可变成员"。

即使FriendModel符合ObservableObject,问题是ObservableObjects不会自动合成。FriendModel@Published属性的更改不会被包含的ModelData注意到,这意味着(在这种情况下(SwiftUI不会注意到friend.isChosen被修改。

我建议把FriendModel变成struct

我还建议使用Point Free的可组合架构包(或类似的包(作为您的应用程序架构,因为它为此类问题提供了全面的解决方案。

尝试使用这个:

ForEach($modelData.friends) { $friend in // <-- here $

Body仅对所使用的状态进行调用。由于chosenFriends不在body中使用,所以在按钮操作中更改时不会调用它。

要修复此问题,请编写一个函数isFriend,在chosenFriends数组中查找好友ID,并使用body中的结果来显示星形。既然现在使用了chosenFriends,身体就会被调用。还可以更改按钮以调用addFriend函数,顺便说一句,它最好命名为chooseFriend。

最新更新