SwiftUI -在特定条件下隐藏导航栏



是否可以在视图打开时显示/隐藏导航栏,但在某些情况下我希望显示导航栏,而在其他情况下我希望隐藏它。

当我打开视图,我想显示导航栏标题,但是当一个事件被取消了,我在视图上显示一条消息,在这一点上我想隐藏导航栏。为此,我创建了一个状态变量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")
}
}

如果你想隐藏它,你应该把value of navigationBarBackButtonHidden()设为true,但是在你所有的步骤中,value总是为false,这意味着Hidden = false。

最新更新