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
另一种方法是(重新)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)
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |