我的意思是; 如何在(例如)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)
}
}
(我的问题现在被标记为别人的重复。我 可以解释为什么这不是事实。我正在“复制”的问题 除了有人问:“如何在 一定的时间”,而我的问题是“如何推送视图 一定时间后。”非常接近,但不能重复。)
答案 0 :(得分:0)
在SwiftUI中,您必须使用NavigationView
和NavigationLink
进行导航。您还可以使用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()
}
}
答案 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()
}
}
}