swift - 我如何能够在设定的时间后执行代码(例如推送视图)| 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)
}
}
这是画布的图像。
(我的问题现在被标记为与其他人的重复。我可以解释为什么这不是真的。我“重复”的问题正是有人问,“我如何在一定时间后更改文本”,而我的问题是,“如何在一定时间后推送视图。”非常接近,但不是重复的。)
解决方案
在 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()
}
}
推荐阅读
- android-fragments - 在我自己的应用程序上显示来自其他应用程序的活动
- java - String 的 indexOf(String obj) 方法在没有 String 对象的情况下如何工作?
- r - 按组移动窗口不同计数
- php - 从绳子上剪下来并放在同一绳子上的其他位置
- vb.net - 动态填充 ListBox vb.net 的有效方法
- xamarin - Xamarin Listview:滚动时标签 IsVisible 绑定消失
- c - 阻止调用“dlsym”(RTLD_NEXT)
- node.js - Angular - 如何指定与系统上安装的版本不同的 node.js 版本?
- javascript - 没有变量的“true ===”有什么作用?
- python - 如何使用 Pandas(在 Python 中)在现有 excel 文件中的不同位置(row_index、column_index)重复编辑数据(标量值)