我正在尝试开发一个应用程序以进行一些认知测试
打开应用程序时,会出现带有NavigationLink {}的NavigationView {}
到目前为止正常链接之一 NavigationLink(destination: IntermediateCoreView()) { Text("Go to tests") }
带您进入测试的“预筛选”,您可以从中链接到“测试”的自身。从IntermediateCoreView.swift您可以 NavigationLink(destination: ContentView()) { Text("+ new test") }
哪个可行,您可以参加考试。在测试结束(经过X秒)后,它会显示一条警报,提示用户时间已用完,并将其带回Intermediate CoreView
当IntermediateCoreView导航视图中的“后退”按钮返回到“测试”视图时,这就是错误的地方。不回到初始视图
我知道这是“预期的行为”,测试已从发送到的屏幕返回。有没有办法覆盖这个?
要添加一个最小的示例-.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
。可以将其视为网页。如果您从一个导航到下一个,然后单击指向第一个的链接,则实际上您已前进至第一页,如果单击“后退”按钮,则会进入第二页。这里也是一样。
相反,您应该使用@Environment(\.presentationMode) var presentationMode
后者,当您调用时self.presentationMode.wrappedValue.dismiss()
将触发您返回显示试图从中导航的视图的视图。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句