Swiftui 调用ScrollView';从观察者或外部视图滚动到

Swiftui 调用ScrollView';从观察者或外部视图滚动到,swiftui,Swiftui,当用户选择一个选项卡时,我试图重置我的ScrollView。问题是所有教程都是针对嵌套在ScrollView中的按钮的。我的ScrollView与我需要点击以重置ScrollView的位置完全不同 我找到了这个教程- 但是我得到了一个错误“在范围内找不到代理” 如果有人知道在视图之外设置ScrollView位置的更简单的实现,我很乐意听到。根据问题中的链接改编示例,您的代码可以如下所示: struct ContentView: View { @State private var scr

当用户选择一个选项卡时,我试图重置我的ScrollView。问题是所有教程都是针对嵌套在ScrollView中的按钮的。我的ScrollView与我需要点击以重置ScrollView的位置完全不同

我找到了这个教程-

但是我得到了一个错误“在范围内找不到代理”


如果有人知道在视图之外设置ScrollView位置的更简单的实现,我很乐意听到。

根据问题中的链接改编示例,您的代码可以如下所示:

struct ContentView: View {
    @State private var scrollTarget: Int?

    var body: some View {
        Button("Reset") {
            scrollTarget = 0
        }
        ScrollViewReader { proxy in
            ScrollView {
                VStack {
                    ForEach(0...50, id: \.self) {
                        Text("\($0)")
                    }
                }
            }
            .onChange(of: scrollTarget) { target in
                if let target = target {
                    scrollTarget = nil
                    withAnimation {
                        proxy.scrollTo(target)
                    }
                }
            }
        }
    }
}
如果需要,您可以将
scrollTarget
移动到
ObservableObject
并从视图外部调用它:

class GlobalObserver: ObservableObject {
    @Published var scrollTarget: Int?
}

struct ContentView: View {
    @EnvironmentObject var global: GlobalObserver

    var body: some View {
        ScrollViewReader { proxy in
            ScrollView {
                VStack {
                    ForEach(0...50, id: \.self) {
                        Text("\($0)")
                    }
                }
            }
            .onChange(of: global.scrollTarget) { target in
                if let target = target {
                    global.scrollTarget = nil
                    withAnimation {
                        proxy.scrollTo(target)
                    }
                }
            }
        }
    }
}

最终,我需要交换引起我最初问题的ScollView和ScrollViewReader,但这是一个完美的实现。我会将其标记为正确,这样其他人可以比我更快地解决此问题。非常感谢
class GlobalObserver: ObservableObject {
    @Published var scrollTarget: Int?
}

struct ContentView: View {
    @EnvironmentObject var global: GlobalObserver

    var body: some View {
        ScrollViewReader { proxy in
            ScrollView {
                VStack {
                    ForEach(0...50, id: \.self) {
                        Text("\($0)")
                    }
                }
            }
            .onChange(of: global.scrollTarget) { target in
                if let target = target {
                    global.scrollTarget = nil
                    withAnimation {
                        proxy.scrollTo(target)
                    }
                }
            }
        }
    }
}