【问题标题】:Modify view inside a ForEach in SwiftUI在 SwiftUI 中修改 ForEach 内的视图
【发布时间】:2021-02-15 22:03:23
【问题描述】:

我尝试更新 ForEach 的一项的位置。我只想从 ForEach 的数组中拖出一个项目。其余的应该保持不变。我尝试了几种不同的方法,结果总是所有项目都被拖动或根本没有项目。

在这个阶段我真的很沮丧,所以如果你能帮助我,我会非常高兴!如果您需要更多信息,请随时询问,我是 stackOverflow 的新手。

struct ContentView: View {

    var texts: [String] = ["Test1", "Test2"]

    @State var positon: CGSize = .zero

    var body: some View {
        HStack {
            ForEach(texts, id: \.self) { text in
                Text(text)
                    .offset(y: positon.height)
                    .gesture(
                        DragGesture()
                            .onChanged { value in
                                positon = value.translation
                            }
                            .onEnded { value in
                                positon = .zero
                            }
                    )
            }
        }
    }
}

【问题讨论】:

标签: arrays swift swiftui swiftui-foreach draggesture


【解决方案1】:

Text 两个视图同时被拖动,因为两个 Text 视图 offset(y: ...) 依赖于同一个 position 变量。


这样的事情应该可以工作:

struct ContentView: View {

    var texts: [String] = ["Test1", "Test2"]

    var body: some View {
        HStack {
            ForEach(texts, id: \.self) { text in
                DraggableText(text: text)
            }
        }
    }
}

struct DraggableText: View {

    var text: String

    @GestureState var position: CGSize = .zero

    var body: some View {
        Text(text)
            .offset(y: position.height)
            .gesture(
                DragGesture().updating($position, body: { value, state, transaction in
                    state = value.translation
                })
            )
    }
}

每个DraggableText 都有自己的位置属性。

【讨论】:

  • 非常感谢!
【解决方案2】:

您正在更改值position,这两个视图的使用方式相同。

如果您希望每个视图独立移动,或者以其他方式分别跟踪它们的位置,您将需要一个单独的 @State 变量。

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2021-10-28
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2022-01-21
    相关资源
    最近更新 更多