SwiftUI - 如何设置 Child 屏幕标题

SwiftUI - How To Set Child Screen Title

我有一个 SwiftUI 主屏幕:

import SwiftUI

struct HomeView: View {
    @State private var navigateToSettingsView : Bool = false
    
    var body: some View {
        NavigationView {
            if navigateToSettingsView {
                NavigationLink(destination: UserSettingsView(), isActive: $navigateToSettingsView) {
                    EmptyView()
                }
                .navigationTitle("Home") // This overrides the word Back with Home on the child back button
                .toolbar {
                    ToolbarItem(placement: .principal) {
                        VStack {
                            Text("User Settings").font(.headline)
                        }
                    }
                }
            }
            else {
                NavigationLink(destination: Text("Hello, I am HomeView child screen")) {
                    homeScreen
                }
                .toolbar {
                    ToolbarItemGroup(placement: .navigationBarTrailing) {
                        Button(action: {
                            navigateToSettingsView = true
                        }) {
                            Image(systemName: "gearshape")
                        }
                    }
                    ToolbarItemGroup(placement: .navigationBarLeading) {
                        Text("App Name")
                    }
                }
            }
        }
    }
}

extension HomeView {
    private var homeScreen: some View {
        VStack {
            Text("Hello, I am HomeView")
        }
        .frame(maxWidth: .infinity)
    }
}

UserSettingsView 现在只是基本的:

import SwiftUI

struct UserSettingsView: View {
    var body: some View {
        VStack {
            Text("I am a UserSettingsView")
        }
    }
}

我遇到的困难是在用户单击 Gear 图标时设置 child 屏幕的标题。 ToolbarItem 似乎被忽略了。如何设置 child 屏幕的标题,使其具有用户设置的标题?

我相信您可以使用更简洁的方法实现您想要的。

下面的示例将 Button 替换为另一个 NavigationLink。它保留 Home 文本而不是 Back,但它还在用户设置屏幕中显示标题。唯一的问题是标题在顶部区域的中心,而不是在领先的位置。

请注意,@State 变量已不存在。

struct Example: View {
    
    var body: some View {
        NavigationView {
                NavigationLink(destination: Text("Hello, I am HomeView child screen")) {
                    Text("I'm a home screen")
                }
                .navigationTitle("Home")
                .navigationBarTitleDisplayMode(.inline)
                .toolbar {
                    ToolbarItemGroup(placement: .navigationBarTrailing) {
                        NavigationLink(destination: UserSettingsView().navigationTitle("User settings")) {
                            Image(systemName: "gearshape")
                        }
                    }
                    ToolbarItemGroup(placement: .navigationBarLeading) {
                        Text("App Name")
                    }
            }
        }
    }
}