嵌入式导航链接
Embedded navigationlinks
我正在尝试开发一个应用程序来进行一些认知测试
打开应用时,有一个 NavigationView{} 和 NavigationLink{}
到目前为止一切正常
link之一
NavigationLink(destination: IntermediateCoreView()) { Text("Go to tests") }
将您带到测试的“预筛选”,您可以从中 link 到 'test' 它自己
从 IntermediateCoreView.swift 你可以 NavigationLink(destination: ContentView()) { Text("+ new test") }
哪个有效,你可以测试一下。在测试结束时(X 秒过去了),然后它会显示一条警告,提示用户 运行 超时并将他们带回中级 CoreView
这是错误的地方,因为 NavigationView 中的 IntermediateCoreView、'Back' 按钮返回到 'test' 视图。不回InitialView
我知道这是 'expected behaviour',测试已从发送到的屏幕返回。有没有办法覆盖它?
添加一个最小示例 - .app 文件:
import SwiftUI
@main
struct minRep2App: App {
var body: some Scene {
WindowGroup {
initialView()
}
}
}
然后是初始视图控制器:
import SwiftUI
struct initialView: View {
var body: some View {
NavigationView{
List{
NavigationLink(destination: ContentView()) {
Text("Go to CoRe tests")
}
}
}
}
}
struct initialView_Previews: PreviewProvider {
static var previews: some View {
initialView()
}
}
最后是测试演示
import SwiftUI
struct ContentView: View {
@State private var timeRemaining = 50.00
@State private var showingAlert = false
@State var showIntermediate: Bool = false
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
NavigationLink(destination: initialView(), isActive: self.$showIntermediate)
{
EmptyView()
}
Text("Test goes here")
.padding()
HStack{
// Text("Score: \(score)")
Text("Time: \(timeRemaining)")
}.padding(.bottom, 10)
.onReceive(timer) { time in
if self.timeRemaining > 0.1 {
self.timeRemaining -= 1
}
if self.timeRemaining == 0.0 {
self.showingAlert = true
self.timer.upstream.connect().cancel()
}
}
.alert(isPresented: $showingAlert){
Alert(title: Text("Warning"), message: Text("Sorry your time is up!"), dismissButton: .default(Text("OK"), action: {
self.showIntermediate = true
})
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
将您的 ContentView
更改为:
import SwiftUI
struct ContentView: View {
@Environment(\.presentationMode) var presentationMode
@State private var timeRemaining = 50.00
@State private var showingAlert = false
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
Text("Test goes here")
.padding()
HStack{
// Text("Score: \(score)")
Text("Time: \(timeRemaining)")
}.padding(.bottom, 10)
.onReceive(timer) { time in
if self.timeRemaining > 0.1 {
self.timeRemaining -= 1
}
if self.timeRemaining == 0.0 {
self.showingAlert = true
self.timer.upstream.connect().cancel()
}
}
.alert(isPresented: $showingAlert){
Alert(title: Text("Warning"), message: Text("Sorry your time is up!"), dismissButton: .default(Text("OK"), action: {
self.presentationMode.wrappedValue.dismiss()
})
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这与可以正常工作的 back
按钮无关。问题是您的警报中的逻辑导致您实例化一个新的、完全不同的 InitialView
。把它想象成网页。如果您从一个导航到下一个,然后单击转到第一个的 link,您实际上已经前进到第一页,如果您单击后退按钮,您将到达第二页.这里也是一样。
相反,您应该使用 @Environment(\.presentationMode) var presentationMode
,当您调用 self.presentationMode.wrappedValue.dismiss()
时,它会触发您返回到显示您试图返回的视图的视图。
我正在尝试开发一个应用程序来进行一些认知测试
打开应用时,有一个 NavigationView{} 和 NavigationLink{}
到目前为止一切正常
link之一
NavigationLink(destination: IntermediateCoreView()) { Text("Go to tests") }
将您带到测试的“预筛选”,您可以从中 link 到 'test' 它自己
从 IntermediateCoreView.swift 你可以 NavigationLink(destination: ContentView()) { Text("+ new test") }
哪个有效,你可以测试一下。在测试结束时(X 秒过去了),然后它会显示一条警告,提示用户 运行 超时并将他们带回中级 CoreView
这是错误的地方,因为 NavigationView 中的 IntermediateCoreView、'Back' 按钮返回到 'test' 视图。不回InitialView
我知道这是 'expected behaviour',测试已从发送到的屏幕返回。有没有办法覆盖它?
添加一个最小示例 - .app 文件:
import SwiftUI
@main
struct minRep2App: App {
var body: some Scene {
WindowGroup {
initialView()
}
}
}
然后是初始视图控制器:
import SwiftUI
struct initialView: View {
var body: some View {
NavigationView{
List{
NavigationLink(destination: ContentView()) {
Text("Go to CoRe tests")
}
}
}
}
}
struct initialView_Previews: PreviewProvider {
static var previews: some View {
initialView()
}
}
最后是测试演示
import SwiftUI
struct ContentView: View {
@State private var timeRemaining = 50.00
@State private var showingAlert = false
@State var showIntermediate: Bool = false
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
NavigationLink(destination: initialView(), isActive: self.$showIntermediate)
{
EmptyView()
}
Text("Test goes here")
.padding()
HStack{
// Text("Score: \(score)")
Text("Time: \(timeRemaining)")
}.padding(.bottom, 10)
.onReceive(timer) { time in
if self.timeRemaining > 0.1 {
self.timeRemaining -= 1
}
if self.timeRemaining == 0.0 {
self.showingAlert = true
self.timer.upstream.connect().cancel()
}
}
.alert(isPresented: $showingAlert){
Alert(title: Text("Warning"), message: Text("Sorry your time is up!"), dismissButton: .default(Text("OK"), action: {
self.showIntermediate = true
})
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
将您的 ContentView
更改为:
import SwiftUI
struct ContentView: View {
@Environment(\.presentationMode) var presentationMode
@State private var timeRemaining = 50.00
@State private var showingAlert = false
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
Text("Test goes here")
.padding()
HStack{
// Text("Score: \(score)")
Text("Time: \(timeRemaining)")
}.padding(.bottom, 10)
.onReceive(timer) { time in
if self.timeRemaining > 0.1 {
self.timeRemaining -= 1
}
if self.timeRemaining == 0.0 {
self.showingAlert = true
self.timer.upstream.connect().cancel()
}
}
.alert(isPresented: $showingAlert){
Alert(title: Text("Warning"), message: Text("Sorry your time is up!"), dismissButton: .default(Text("OK"), action: {
self.presentationMode.wrappedValue.dismiss()
})
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这与可以正常工作的 back
按钮无关。问题是您的警报中的逻辑导致您实例化一个新的、完全不同的 InitialView
。把它想象成网页。如果您从一个导航到下一个,然后单击转到第一个的 link,您实际上已经前进到第一页,如果您单击后退按钮,您将到达第二页.这里也是一样。
相反,您应该使用 @Environment(\.presentationMode) var presentationMode
,当您调用 self.presentationMode.wrappedValue.dismiss()
时,它会触发您返回到显示您试图返回的视图的视图。