swift 如何从堆栈中加载对象并将其移除,以显示下一个对象

yyyllmsg  于 2023-01-04  发布在  Swift
关注(0)|答案(1)|浏览(97)

我的应用程序与Tinder非常相似,用户通过向右(喜欢)或向左(拒绝)滑动人们的个人资料来进行"匹配"。
我面临的唯一问题是识别HomeView中显示的每个用户,如何删除该用户,显示下一个用户,以及知道哪个喜欢的用户必须作为网络调用中的参数。

    • Person结构:**
struct Person: Identifiable, Hashable {
    var age: Int
    var username: String
}
    • 显示每个PersonCardView:**
struct CardView: View {
    @State var person: Person

    var body: some View {
                ZStack {
                     Image()
                       .frame(width: 200, height: 600)
                VStack() {
                    HStack {
                        Text(person.username)
                             .font(.system(size: 32, weight: .heavy))
                                
                        Text(String(person.age))
                             .font(.system(size: 28, weight: .light))
                    }
                }
            }
    }
}
    • 以及CardStack,其中ForEach获取userMng中的所有Person。用户:**

一个二个一个一个

    • 最后是HomeView,用户可在其中决定喜欢或不喜欢哪个人:**
struct HomeView: View {
    
    @EnvironmentObject var userMng: UserManager
    @State var person: Person?

    var body: some View {
        VStack {
               CardStack(person: person ?? Person(data: ["username": "ExampleUsername"]))
        
        HStack { // Here is where all three buttons are shown

            CircleButtonView(type: .no) {
                // Button action...
            }

            CircleButtonView(type: .back) {
                // Button action...
            }

            CircleButtonView(type: .heart) {
                 if let person = userMng.people.last {
                     userMng.swipe(person, _direction: .like)
                 }
            }
        }
        }
    } 
}

我唯一想到的是为每个显示的用户使用一个currentIndex,但老实说,我不知道如何实现它。

lmvvr0a8

lmvvr0a81#

首先,我不认为在所有可用的人上使用zstack是一个好主意,因为这会占用大量的内存。在用户滑动时加载每个人的carview应该可以用更少的资源完成这项工作。
但是如果你想保留zstack,你只需要在swipe时添加removeLast(),因为只有最后一个对象会被移除,然后视图会自动更新。

class UserManager: ObservableObject {

   @Published var people: [Person] = []

   public func swipe(_ person: Person, _direction: SwipeDirection) { // Networking to backend
        people.removeLast()
        switch _direction {
        case .like:
            sendFriendRequest(to: person.uid)
        case .nope:
            print("nope")
        }
    } }

相关问题