2

我正在使用一个基于SwiftUI的应用程序,该应用程序依赖于NavigationView从屏幕转换。

我需要在导航栏上设置背景颜色,并且找到了大部分时间都可以使用的代码。

当应用程序以纵向模式启动时,一切都在旋转中正常工作。

但是,当应用程序以横向模式启动时,条形图默认为灰色,并且仅在第一次旋转后更新。

下面,我有最少的代码来重新创建我的问题:

import SwiftUI

struct ContentView: View {
    var body: some View {
        return NavigationView {
            List {
                NavigationLink(destination: Text("A")) {
                    Text("See A")
                }
            }
            .background(NavigationConfigurator { navigationConfigurator in
                navigationConfigurator.navigationBar.barTintColor = .orange
            })
            .navigationBarTitle(Text(verbatim: "Home"), displayMode: .inline)
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        UIViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewController,
                                context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
        if let navigationController = uiViewController.navigationController {
            self.configure(navigationController)
            print("Successfully obtained navigation controller")
        } else {
            print("Failed to obtain navigation controller")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

以纵向模式启动时应用程序的显示方式:

在此处输入图像描述

...并旋转到横向...

在此处输入图像描述

最后,以横向模式启动时的外观。

在此处输入图像描述

我还注销了NavigationConfigurator,发现当它以纵向模式启动时,会拨打两个电话。第一个找不到导航控制器,但第二个找到了。

当我以横向模式启动时,只进行了一次调用,但未能找到它。旋转后,它会找到它并成功更新颜色。

我确实尝试通过@State管理强制重绘,但没有成功。

由于没有将应用程序锁定为纵向模式,我已经没有想法了。

4

1 回答 1

4

如果它只是关于条形颜色而不需要更多导航控制器,那么使用外观更简单,因为

struct ContentView: View {
    init() {
        UINavigationBar.appearance().barTintColor = UIColor.orange
    }
    // .. your other code here

此解决方案适用于任何初始方向。使用 Xcode 11.4 测试。

备用:

如果您仍想通过配置器访问,根据我的经验,以下解决方案(经过测试和工作)更可靠

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        let controller = UIViewController()
        DispatchQueue.main.async {
            if let navigationController = controller.navigationController {
                self.configure(navigationController)
                print("Successfully obtained navigation controller")
            } else {
                print("Failed to obtain navigation controller")
            }
        }
        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewController,
                                context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
    }
}
于 2020-04-24T14:16:04.380 回答