首页 > 解决方案 > 我如何能够在设定的时间后执行代码(例如推送视图)| SwiftUI

问题描述

我的意思是; 在(例如)20 秒计时器之后,我如何能够推送视图(意味着导航到另一个屏幕)? 我正在通过 SwiftUI 开发一个应用程序,但我只知道这么多。如果有人能帮助我度过难关,我将不胜感激。这是视图推送之前的页面代码。

struct SwiftUIView : View {
var body: some View {
    NavigationView() {
        VStack{
            Text("Thank you for your time.")
                .font(.headline)
                .multilineTextAlignment(.center)
                .lineLimit(5)
                .padding(.horizontal, 50.0)
            Text("We'll be in touch shortly.")
                .font(.subheadline)
                .multilineTextAlignment(.center)
                .lineLimit(5)
                .padding(.horizontal, 50.0)
                .padding(.bottom, 450.0)
        }
    }.navigationBarBackButtonHidden(true)
    }
}

这是画布的图像。

(我的问题现在被标记为与其他人的重复。我可以解释为什么这不是真的。我“重复”的问题正是有人问,“我如何在一定时间后更改文本”,而我的问题是,“如何在一定时间后推送视图。”非常接近,但不是重复的。)

标签: swiftxcodeswiftui

解决方案


在 SwiftUI 中,您必须使用NavigationViewNavigationLink进行导航。您还可以使用NavigationView和使用NavigationLink属于该NavigationLink结构的此 API 以编程方式导航:

/// Creates an instance that presents `destination` when active.
public init(destination: Destination, isActive: Binding<Bool>, @ViewBuilder label: () -> Label)

所以,你可以做这样的事情(确切的代码可能取决于你真正需要得到的东西):

class ContentViewModel: ObservableObject {
    @Published var navigate = false

    init() {
        DispatchQueue.main.asyncAfter(deadline: .now()+2) { //navigate after 2 secs
            self.navigate = true
        }
    }        
}

struct ContentView: View {
    @ObservedObject var contentViewModel = ContentViewModel()

    var body: some View {
        NavigationView {
            ZStack {
                Text("Hello World!")
                NavigationLink(destination: DetailView(), isActive: $contentViewModel.navigate) {
                    EmptyView() //you don't need a view if you want to navigate programmatically
                }
            }
        }            
    }
}

struct DetailView: View {
    var body: some View {
        Text("Navigation complete!")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

不幸的是,SwiftUI 中有一个错误:如果您运行上面的代码,您会看到在详细视图中点击后退按钮会使内容视图再次导航到详细视图。就一次。如果您再次点击后退按钮,则该错误将不再发生。这是一个已知问题(我们都在等待 Apple 解决此问题)。您可以覆盖默认的后退按钮来解决此问题。这是一种解决方法,但我们目前不能做得更好:

class ContentViewModel: ObservableObject {
    @Published var navigate = false

    init() {
        DispatchQueue.main.asyncAfter(deadline: .now()+2) {
            self.navigate = true
        }
    }
}

struct ContentView: View {
    @ObservedObject var contentViewModel = ContentViewModel()

    var body: some View {
        NavigationView {
            ZStack {
                Text("Hello World!")
                NavigationLink(destination: DetailView(contentViewModel: contentViewModel), isActive: $contentViewModel.navigate) {
                    EmptyView()
                }
            }
        }
    }
}

struct DetailView: View {
    @ObservedObject var contentViewModel: ContentViewModel

    var body: some View {
        Text("Navigation complete!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: Text("Back").onTapGesture { //this is just an example, it's a plain text
                self.contentViewModel.navigate = false
            })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

推荐阅读