SwiftUI:如何弹出 WatchOS 的根视图?

Sid*_*Sid 5 apple-watch watchkit watchos swiftui

我需要从深层细节视图弹出到根视图。虽然以下使用 isDetailList 和 isActive 的解决方案适用于 iOS,但它不适用于 watchOS。isDetailList 命令在 watchOS 中不可用。

import SwiftUI

class AppState : ObservableObject {
    @Published var showState : Bool = false
}

struct MoreTests: View {
    @EnvironmentObject var appState : AppState    // injected from SceneDelegate
    var body: some View {
        NavigationView {
            NavigationLink(
                destination: MoreView1(),
                isActive: $appState.showState,      // required to work
                label: { Text("Go to MoreView1") }
            ).isDetailLink(false)       // required to work
        }.navigationBarTitle("Root")
    }
}

struct MoreView1: View {
    var body: some View {
        NavigationLink(
            destination: MoreView2(),
            label: { Text("Go to MoreView2") }
        )
        .navigationBarTitle("MoreView1")
    }
}

struct MoreView2: View {
    var body: some View {
        NavigationLink(
            destination: MoreView3(),
            label: { Text("Go to MoreView3") }
        )
        .navigationBarTitle("MoreView2")
    }
}

struct MoreView3: View {
    @Environment(\.presentationMode) var presentationMode
    @EnvironmentObject var appState : AppState
    var body: some View {
        VStack {
            Button(action: {
                self.appState.showState = false       // required
            }) {
                Text("Dismiss to root")
            }
        }.navigationBarTitle("MoreView3")
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS 解决方案来自这里 --> SwiftUI: How to pop to Root view

vad*_*ian 0

另一种方法是(重新)id设置NavigationView

AppState用。。。来代替

class AppState : ObservableObject {
    @Published var appID = UUID()
}
Run Code Online (Sandbox Code Playgroud)

MoreTests删除isActive参数并在设置之前添加此修饰符navigationBarTitle

NavigationView {...

}
.id(appState.appID)
Run Code Online (Sandbox Code Playgroud)

MoreView3分配一个新的UUID给appID

Button(action: {
    self.appState.appID = UUID()
}) {
    Text("Dismiss to root")
}
Run Code Online (Sandbox Code Playgroud)