代码之家  ›  专栏  ›  技术社区  ›  Joris416

SwiftUI ScrollViewReader scrollTo未按预期工作

  •  1
  • Joris416  · 技术社区  · 2 年前

    我正在我的应用程序中构建一个部分,允许用户通过瞄准目标来训练他们的运动技能。用户可以在列表中看到他们的目标。如果有1个人以上在我的应用程序中使用此功能,他们的培训目标列表将在滚动视图中并排放置。我希望我的应用程序自动滚动到当前活动的用户。我使用的代码是:

    func getTrainingTargetsScrollView(size: CGSize) -> some View {
        let players: [DSPlayer] = trainingController.currentExercise?.players ?? []
        
        return ScrollViewReader { value in
            ScrollView(.horizontal) {
                HStack(spacing: 0) {
                    ForEach(players, id: \.id) { player in
                        ExerciseTable(player: player)
                            .frame(width: size.width)
                    }
                }
            }
            .onReceive(trainingController.$currentPlayer, perform: { newValue in
                if let id = newValue?.id {
                    withAnimation {
                        value.scrollTo(id)
                    }
                }
            })
            .frame(height: size.height - 130)
        }
    }
    

    onReceive被触发,我已经验证了它传递的玩家是正确的,并且与滚动视图中的玩家具有匹配的ID。但是,它根本不会滚动。

    有人能看出我做错了什么吗?

    2 回复  |  直到 2 年前
        1
  •  4
  •   Sunderam Dubey    2 年前

    你需要付出 id 到要滚动到的视图,例如:

    ForEach(players, id: \.id) { player in
        ExerciseTable(player: player)
            .frame(width: size.width)
            .id(player.id)              // << here !!
    }
    
    推荐文章