如何仅针对一个视图更改导航标题的颜色?

3
我想将View1的导航标题颜色更改为绿色,而不更改View2的导航标题颜色。 我查看了此问题,并成功更改了所有颜色,但这不符合我的需求。 在SwiftUI中,是否有一种方法仅更改特定视图的导航标题颜色而不更改整个NavigationView的颜色?
以下是我的代码:
struct View1: View {
    // copied from the question I mentioned above
    init() {
        let navbarAppearance = UINavigationBarAppearance()
        navbarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.green]
        navbarAppearance.titleTextAttributes = [.foregroundColor: UIColor.green]
        navbarAppearance.configureWithTransparentBackground()
        UINavigationBar.appearance().standardAppearance = navbarAppearance
        UINavigationBar.appearance().compactAppearance = navbarAppearance
        UINavigationBar.appearance().scrollEdgeAppearance = navbarAppearance
    }

    var body: some View {
        NavigationView{
            NavigationLink(
                destination: View2())
            {
                Text("go to view 2")
            }
            .navigationTitle("View1")
        }
    }
}

struct View2: View {
    var body: some View {
        Text("view2")
            .navigationTitle("View2")
    }
}

非常感谢您提供的任何帮助!


你不能直接使用提供的SwiftUI修饰符来实现这个。你需要想出自定义修饰符或函数。https://dev59.com/6Irda4cB1Zd3GeqPPrLX 这可能会有所帮助。 - Steven-Carrot
1个回答

2

这个链接可能会有帮助。这里有一个解决方案:

struct View1: View {
    var body: some View {
        NavigationView{
            ZStack {
                NavigationControllerAccessor(viewWillAppear: { nav in
                    nav.navigationBar.largeTitleTextAttributes = [
                        .foregroundColor: UIColor.green
                    ]
                }, viewWillDisappear: { nav in
                    nav.navigationBar.largeTitleTextAttributes = nil
                })
                
                NavigationLink(
                    destination: View2())
                {
                    Text("go to view 2")
                }
            }
            .navigationTitle("View1")
            
        }
        // This is important, it doesn't work without it.
        .navigationViewStyle(.stack)
    }
}

struct View2: View {
    var body: some View {
        Text("view2")
            .navigationTitle("View2")
    }
}

struct NavigationControllerAccessor: UIViewControllerRepresentable {
    var viewWillAppear: (UINavigationController) -> Void
    var viewWillDisappear: ((UINavigationController) -> Void)? = nil
    
    private let proxyController = ViewController()
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationControllerAccessor>) -> UIViewController {
        proxyController.viewWillAppearCallback = viewWillAppear
        if let viewWillDisappear = viewWillDisappear {
            proxyController.viewWillDisappearCallback = viewWillDisappear
        }
        return proxyController
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationControllerAccessor>) {}
    
    private class ViewController: UIViewController {
        var viewWillAppearCallback: (UINavigationController) -> Void = { _ in }
        var viewWillDisappearCallback: (UINavigationController) -> Void = { _ in }
        
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            if let nav = navigationController {
                viewWillAppearCallback(nav)
            }
        }
        
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            if let nav = navigationController {
                viewWillDisappearCallback(nav)
            }
        }
    }
}

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