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

3

当视图打开时,是否可能显示/隐藏导航栏,但在某些条件下,我希望显示导航栏,在其他条件下,我希望隐藏它。

假设当我打开视图时,我希望显示具有标题的导航栏,但当事件被取消时,我在视图中显示一条消息,并且在此期间我希望隐藏导航栏。为此,我创建了一个状态变量“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")
    }
}

消息视图是一种全屏显示当前视图的视图吗?还是某种通知?请问是否可能发布消息视图代码,以便我们可以获得一个可工作的示例?我想我看到了问题所在,但没有完全可工作的代码很难确定。 - nickreps
消息视图是自定义视图的一部分。它不是全屏幕的。由于代码很多,所以我只提供了一些片段来解释我的问题。让我尝试将代码移动到 playground 并提供一些你可以尝试的东西。 - tech_human
1
尝试将 NavigationView 从场景中移动到 ContentView 内部。 - Asperi
1个回答

1

如果您想隐藏导航栏返回按钮,应将navigationBarBackButtonHidden()的值设为true。但是在您的所有步骤中,该值始终为false,这意味着Hidden = false。


谢谢你发现了这个问题@tail!我已经修复了代码。所以最初当视图加载时,我看到导航栏。当事件被取消并且消息视图出现时,由于我将hideNavBar设置为true,因此导航栏被隐藏。但是当消息视图消失时,导航栏仍然在整个应用程序中保持隐藏状态,即使我在onDisappear()中再次将hideNavBar设置为false。我只有一个导航视图在我的应用程序文件中,并且所有的视图都从Content View中调用,因此整个应用程序都使用一个导航视图。 - tech_human
修复代码后,导航栏被隐藏了,但当我将变量设置为false时,它并没有再次显示出来。因此,在打开视图时显示导航栏,在onAppear中设置@State变量以隐藏导航栏,但在onDisappear()中更新变量后,导航栏不会再次显示。 - tech_human
你是在告诉我 presentationMode.wrappedValue.dismiss() 可以关闭 ContentView() 并返回到另一个视图吗? - Steven-Carrot
如果在ContentView()之前有其他视图,但在ContentView()被解除后仍然显示导航栏,则该行为是完全正确和正常的。每个不同的视图都有一个不同的导航栏。 - Steven-Carrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接