我一直在尝试改变SwiftUI中一个对象的偏移值,但是不能让它工作。我觉得这里缺少了一些基本的东西。
下面是主要的SwiftUI代码。我试图在用户滑动时更改堆栈中每张卡的偏移值。然而,在“user.offset = value.translation.width”行上,我得到错误“无法分配属性:'user'是一个'let'常量”。我想我理解这是因为你实际上不能改变你用ForEach循环迭代的对象。但是,我正在努力找到一个解决办法。
import SwiftUI
import Kingfisher
struct GroupSessionView: View {
@ObservedObject var userViewModel = ExploreUsersViewModel()
var body: some View {
VStack(spacing: 10) {
ZStack {
ForEach(Array(zip(userViewModel.userCards.indices, userViewModel.userCards)), id: \.0) { index, user in
HStack {
KFImage(URL(string: user.image))
}
.zIndex(Double(userViewModel.users.count - index))
.offset(x: 0)
.gesture(DragGesture().onChanged({ value in
withAnimation {
user.offset = value.translation.width
}
}).onEnded({ (value) in
withAnimation {
user.offset = 0
}
}))
}
}
Spacer()
}
}
}
这是我用来生成userCards数据的视图模型。
class ExploreUsersViewModel: ObservableObject {
@Published var users = [User]()
@Published var userCards = [UserCard]()
let service = UserService()
init() {
fetchUsers()
getCards()
}
func fetchUsers() {
service.fetchUsers { users in
self.users = users
print("Users are \(users)")
}
}
func getCards() {
service.fetchUsers { users in
for user in users {
self.userCards.append(UserCard(id: NSUUID().uuidString, image: user.profileImageUrl, fullName: user.fullname, offset: 0))
}
}
}
}
1条答案
按热度按时间2mbi3lxu1#
在
ForEach
(以及forEach
)中,所有索引变量都是常量。但既然有了索引,解决方案就很简单了:直接修改数组中的项目