经过一段设定的时间后,如何执行代码(例如推送视图)| SwiftUI

时间:2019-10-06 15:02:09

标签: swift xcode 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)
    }
}

这里是image of the canvas.

  

(我的问题现在被标记为别人的重复。我   可以解释为什么这不是事实。我正在“复制”的问题   除了有人问:“如何在   一定的时间”,而我的问题是“如何推送视图   一定时间后。”非常接近,但不能重复。)

2 个答案:

答案 0 :(得分:0)

在SwiftUI中,您必须使用NavigationViewNavigationLink进行导航。您还可以使用NavigationViewNavigationLink通过属于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()
    }
}

答案 1 :(得分:-3)

您有两种选择:

您可以使用

sleep(20)
// code

停止执行您的整个代码,或者

DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
    // code
}

仅在20秒后执行闭包内部的代码。

您必须将此代码插入触发与新视图表示相关的事件的代码中:

struct SwiftUIView : View {

    @State var isNewViewShowed: Bool = false

    var body: some View {
        VStack {
            Button(action: {
                DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
                    isNewViewShowed.toggle()
                }
            }) {
                Text("Present New View")
            }
        }.sheet(isPresented: $isNewViewShowed) {
            NewView()
        }
    }
}