ios 更改SwiftUI ForEach循环中的属性

h6my8fg2  于 2022-12-15  发布在  iOS
关注(0)|答案(1)|浏览(171)

我一直在尝试改变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))
            }
        }
    }
}
2mbi3lxu

2mbi3lxu1#

ForEach(以及forEach)中,所有索引变量都是常量。
但既然有了索引,解决方案就很简单了:直接修改数组中的项目

userViewModel.userCards[index].offset = value.translation.width

相关问题