SwiftUI工具栏未显示在NavigationLink视图上

3
我想在一个位于导航链接内部的视图上显示工具栏。当我导航到第三个视图时,会收到以下消息:

2020-09-15 23:09:31.097289-0500 CountTime[35018:3542166] [断言] displayModeButtonItem 在 DoubleColumn 样式中是由内部管理且未公开。返回空的、未连接的 UIBarButtonItem 来满足非空合同。

但是工具栏没有显示。这只发生在 iPhone 上,而不是 iPad。我正在使用 Xcode 12 GM。

这里是代码:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(
                destination: SecondView(),
                label: {
                    Text("Navigate")
                })
        }
    }
}

struct SecondView: View {
    var body: some View {
        ZStack {
            NavigationLink(
                destination: Text("Destination")
                    .toolbar {
                        ToolbarItem(placement: ToolbarItemPlacement.bottomBar) {
                                Button(action: {
                                    print("sharing")
                                }) {
                                    Image(systemName: "square.and.arrow.up")
                                }
                        }
                    },
                label: {
                    Text("Navigate")
                })
        }
    }
}
3个回答

5

displayModeButtonItem 是内部管理的,不会在 DoubleColumn 样式下暴露

在您的情况下,SwiftUI 以某种原因尝试以 DoubleColumn 样式呈现 NavigationView。

一个可能的解决方案是明确指定样式:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: SecondView()) {
                Text("Navigate")
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

这个可以正常工作,现在工具栏正在显示,但是工具栏在视图之间的转换不够流畅,并且有一个新的控制台消息:[快照] 快照一个尚未至少渲染一次的视图(0x7fcd53e17110,_UIButtonBarStackView)需要afterScreenUpdates:YES。 - Happygallo
1
@Happygallo 看起来是一条无害的调试信息。而工具栏本身还存在问题。我建议您要么在所有视图中添加工具栏,要么在视图顶部使用一个简单的流动按钮(没有工具栏)。 - pawello2222

1

我遇到了相同的问题。

.toolbar {
      ToolbarItemGroup(placement: .navigationBarTrailing) {
        Button(action: {
          showEditView = true
        }, label: {
          Text("Edit")
        })
      }
}

不起作用,但已被弃用的navigationBarItems可以使用。

    .navigationBarItems(trailing:
                          Button(action: {
                            showEditView = true
                          }, label: {
                            Text("Edit")
                          })
    )


目前您的回答不够清晰,请进行[编辑]以添加更多细节,帮助他人理解如何解决问题。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community

0
我遇到了同样的问题。在谷歌搜索并比较我的旧代码后,我发现.toolbar.navigationTitle等等应该放在List之后,而不是NavigationStack(或者NavigationView,在iOS 16中已被弃用)。
struct MySettingView: View {
    private let bgColor = Color("asset_color_bg")
    
    var body: some View {
        NavigationStack {
            
            List {
                NavigationLink("Action 1")
                {
                    Action_1_View()
                        .background(bgColor)
                }
            }
        }
        // This is NOT working.
        .navigationBarTitleDisplayMode(.inline)
        .navigationTitle("Setting")
        .toolbarBackground(bgColor, for: .navigationBar, .tabBar)
        .toolbar {
            ToolbarItem(placement: .navigationBarLeading) {
                Button {
                    // go back
                } label: {
                    Image("asset_arrowleft_btn")
                }.tint(.gray)
            }
        }
    }
}



struct MySettingView: View {
    let bgColor = Color("asset_color_bg")
    
    var body: some View {
        NavigationStack {
            
            List {
                NavigationLink("Action 1")
                {
                    Action_1_View()
                        .background(bgColor)
                }
            }
            // This works.
            .navigationBarTitleDisplayMode(.inline)
            .navigationTitle("Setting")
            .toolbarBackground(bgColor, for: .navigationBar, .tabBar)
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Button {
                        // go back
                    } label: {
                        Image("asset_arrowleft_btn")
                    }.tint(.gray)
                }
            }
        }
    }
}

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