嵌入式导航链接

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() 时,它会触发您返回到显示您试图返回的视图的视图。