You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类Tinder应用:实现卡片滑动移除、切换及用户识别与网络请求

类似Tinder的滑动匹配功能实现方案

核心实现:用currentIndex管理当前展示用户

1. 状态与数据准备

  • 在HomeView里维护两个核心状态:
    • @State var currentIndex = 0:标记当前显示用户在列表中的位置
    • @State var pendingUsers: [Person]:待展示的用户列表(从UserManager获取初始数据)
  • 建议保留一份原始用户数据源备份,避免滑动移除后无法恢复历史数据。

2. 滑动事件处理

在CardStack或CardView中监听滑动手势,判断方向后执行对应逻辑:

  • 右滑(喜欢):
    1. 取出当前用户pendingUsers[currentIndex],提取其唯一标识(比如id)作为网络请求的被喜欢用户参数传给后端
    2. 执行移除或索引更新操作
  • 左滑(拒绝):无需触发喜欢请求,直接执行移除或索引更新
  • 两种滑动后的用户切换逻辑二选一:
    方案一(用索引递进,不移除列表元素):
    currentIndex += 1
    // 触底加载新用户
    if currentIndex >= pendingUsers.count {
        UserManager.shared.loadMoreUsers { newUsers in
            pendingUsers.append(contentsOf: newUsers)
        }
    }
    
    方案二(直接移除当前用户,索引保持不变):
    // 先取出用户做请求(如果是右滑)
    let swipedUser = pendingUsers.remove(at: currentIndex)
    if swipedUser.isLiked {
        sendLikeRequest(to: swipedUser.id)
    }
    // 列表为空时加载新数据
    if pendingUsers.isEmpty {
        UserManager.shared.loadMoreUsers { newUsers in
            pendingUsers = newUsers
        }
    }
    

3. 视图渲染关联

在HomeView中根据currentIndex渲染对应卡片:

if currentIndex < pendingUsers.count {
    CardStack(currentUser: pendingUsers[currentIndex]) { direction in
        handleSwipe(direction: direction)
    }
} else {
    // 展示加载提示或空状态
    VStack {
        Text("暂时没有更多用户")
        Button("刷新") {
            UserManager.shared.refreshUsers { newUsers in
                pendingUsers = newUsers
                currentIndex = 0
            }
        }
    }
}

4. 网络请求参数说明

右滑时的请求核心参数就是被喜欢用户的唯一标识(比如pendingUsers[currentIndex].id),后端需要用这个ID关联当前登录用户(从UserManager.shared.currentUser.id获取),完成匹配逻辑。示例请求结构:

func sendLikeRequest(to likedUserId: String) {
    guard let currentUserId = UserManager.shared.currentUser?.id else { return }
    let params = [
        "current_user_id": currentUserId,
        "liked_user_id": likedUserId
    ]
    // 用你项目里的网络工具发送POST请求到匹配接口
}

5. 边界问题处理

  • 快速连续滑动时,加个状态锁(比如@State var isSwiping = false),避免同时触发多次请求或索引越界
  • 加载新用户时,显示加载动画,避免用户感知到空白

内容的提问来源于stack exchange,提问作者Thomas Kweblin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:11:27