嵌入式导航链接

g5疯子

我正在尝试开发一个应用程序以进行一些认知测试

打开应用程序时,会出现带有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()
    }
}
rb

更改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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章