簡體   English   中英

在 SwiftUI ForEach 循環中改變屬性

[英]Altering property in a SwiftUI ForEach loop

我一直在嘗試更改 SwiftUI 中 object 的偏移值,但無法完全正常工作。 我覺得這里缺少一些基本的東西。

下面是主要的 SwiftUI 代碼。 我正在嘗試在用戶滑動時更改堆棧中每張卡的偏移值。 但是,根據“user.offset = value.translation.width”,我收到錯誤“無法分配給屬性:‘user’是‘let’常量”。 我想我明白那是因為您實際上無法更改您正在使用 ForEach 循環迭代的 object。 但是,我正在努力尋找解決方法。

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()
        }
    }
}

這是我正在使用的視圖 model 來生成 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))
            }
        }
    }
}

ForEach (以及forEach )中,所有索引變量都是常量。

但是因為您有索引,所以解決方案非常簡單:直接修改數組中的項目

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM