当视图打开时,是否可能显示/隐藏导航栏,但在某些条件下,我希望显示导航栏,在其他条件下,我希望隐藏它。
假设当我打开视图时,我希望显示具有标题的导航栏,但当事件被取消时,我在视图中显示一条消息,并且在此期间我希望隐藏导航栏。为此,我创建了一个状态变量“hideNavBar”,我最初将其设置为false,然后当事件被取消即视图模型状态更改为“eventCanceled”时,在我的视图中,我将更新状态变量的值为true。当“hideNavBar”设置为true时,我看到导航栏从视图中隐藏,但是当我在onDisappear()中将其再次设置为false时,我看不到导航栏。
我的整个应用程序都有一个导航视图,该导航视图位于我的应用程序文件中。应用程序文件中的ContentView()打开所有其他视图,因此整个应用程序都使用相同的导航视图。
当视图打开时,是否可以显示和隐藏导航栏?
以下是代码:
class CustomViewModel: ObservableObject {
enum EventDetailsStates {
case idle
case loading
case eventCanceled
}
@Published var state = EventDetailsStates.idle
@Published var reloadData = false
init() {
NotificationCenter.default.addObserver(forName: Notification.Name("eventCanceled"), object: nil, queue: nil, using: self.processEventCanceledNotification(_:))
}
@objc func processEventCanceledNotification(_ notification: Notification) {
// Do something
self.reloadData = false
self.state = .eventCanceled
}
}
struct CustomView: View {
@ObservedObject var viewModel: CustomViewModel
@State var showMessageView = false
@State var hideNavBar = false
@Environment(\.presentationMode) var presentationMode
var body: some View {
VStack {
switch viewModel.state {
// Some other states.
case .eventCanceled:
if self.showMessageView {
MessageView().onAppear() {
self.hideNavBar = true
}.onDisappear() {
self.hideNavBar = false
presentationMode.wrappedValue.dismiss()
}
}
}
}.navigationBarBackButtonHidden(hideNavBar).navigationBarHidden(hideNavBar).navigationBarTitle("Back")
.onAppear() {
if viewModel.reloadData {
viewModel.state = .idle
} else {
self.showMessageView = true
DispatchQueue.main.asyncAfter(deadline: .now() + 15.0) {
self.showMessageView = false
}
}
}
}
}
添加应用程序文件的代码:
import SwiftUI
@main
struct watchApp: App {
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
@SceneBuilder var body: some Scene {
WindowGroup {
NavigationView {
ContentView().environmentObject(UserSettingsStore())
}
}
WKNotificationScene(controller: NotificationController.self, category: "myCategory")
}
}