【问题标题】:SwiftUI displayModeButtonItem is internally managedSwiftUI displayModeButtonItem 是内部管理的
【发布时间】:2023-03-10 14:42:01
【问题描述】:

每次我导航到另一个屏幕时,我都会在控制台中收到此消息:

[Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.

目前我在应用程序的入口点设置了导航视图,如下所示

NavigationView {
        KeyboardView(matrixVM: matrixVM, isNavigationBarHidden: $isNavigationBarHidden)
            .background(Color("background")
            .edgesIgnoringSafeArea(.all))
            .navigationBarTitle("Workspace")
            .navigationBarHidden(self.isNavigationBarHidden)
            .onAppear {
                self.isNavigationBarHidden = true
        }
    }

然后在 KeyboardView 中我有导航链接

NavigationLink(destination: NotebookView(isNavigationBarHidden: $isNavigationBarHidden, saved: matrixVM), label: {
                            Text("Notebooks")
                                .font(.system(size: 14, design: .rounded))
                                .fontWeight(.medium)
                                .foregroundColor(Color("text"))
                                .padding(.trailing, 10)
                        })

在 NotebookView 内,我有一个导航链接列表(每个笔记本都链接到其详细信息页面)

ScrollView(showsIndicators: false) {
                        ForEach(notebooks, id: \.self) { notebook in
                            
                            NavigationLink(destination: ExpandedSnippet(matrixVM: saved ,notebook: notebook)
                                            .navigationBarTitle("Notebook", displayMode: .inline)) {
                                SnippetCard(notebook: notebook, matrixVM: saved)
                                    .frame(width: UIScreen.main.bounds.width)
                            }
                            .padding(.bottom, 30)
                        }
                    }

一切似乎都在工作,但就在几个小时前它没有(我正在使用标签栏,但在工作了几周后它突然开始崩溃)。我觉得这有点乱,我做错了什么。知道为什么吗?感谢您的帮助!

【问题讨论】:

    标签: swiftui xcode12


    【解决方案1】:

    当我在 iPhone 或 iPhone 模拟器上运行时,我在 Xcode 12.1 上得到了这个,而不是在 iPad 模拟器上。

    将此附加到 NavigationView 为我修复了它。

    .navigationViewStyle(StackNavigationViewStyle())
    

    【讨论】:

    【解决方案2】:

    使用 Xcode 12.1 (12A7403),这似乎已修复。

    前面的答案保留在下面以供后代使用。

    我之前也在使用最新的 Xcode 12 beta (12A8189) 时遇到过这个问题。

    这提供了一个简单的 MVP 来演示问题。

    import SwiftUI
    
    struct ContentView: View {
        var body: some View {
            NavigationView {
                List {
                    NavigationLink(destination: DetailView()) {
                        Text("First View")
                    }
                }
                .navigationViewStyle(StackNavigationViewStyle())
            }
        }
    }
    
    struct DetailView: View {
        var body: some View {
            List {
                NavigationLink(destination: Text("Detail Title")) {
                    Text("New View")
                }
            }
            .navigationBarItems(trailing:
                                    Button(action: {
                                        print("Clicked")
                                    }) {
                                        Image(systemName: "square.and.arrow.up")
                                    })
        }
    }
    

    问题归结为我使用的设备。

    在 iPhone 上运行它时,我会看到 OP 发布的消息。

    在 iPad 上运行时,我不会看到任何消息。

    现在,为什么要这样做?

    对于初学者,您可以查看此Apple reference 以获取断言引用的displayModeButtonItem

    或者,查看上述代码的屏幕截图。

    iPhone:

    iPad:

    注意 iPad 如何显示displayModeButtonItem 的图标,而 iPhone 则没有。

    基于此,我认为苹果犯了一个错误。也许它会在下一个版本中得到修复?

    你能做的最好的事情就是to file a bug

    FWIW,我确实查看了release notes,但找不到任何对此的参考。

    【讨论】:

      【解决方案3】:

      .navigationViewStyle(StackNavigationViewStyle()) 附加到 NavigationView 确实可以消除错误。

      不幸的是,这并不总是一个理想的解决方案,有时会引入另一个特定于 StackNavigationViewStyle() 的现有错误,其中:a selected list row's background color remains gray after navigating back

      【讨论】:

        【解决方案4】:

        将我的 iOS 13 应用更新到 iOS 14 后,我看到此错误并且我的导航栏无法正常工作。

        要修复这个错误,我只需要做一个改变:

        NavigationView{
        // other code
        }
        .navigationViewStyle(StackNavigationViewStyle())
        

        【讨论】:

          【解决方案5】:

          就我而言,我使用 navigationBarItems() 修饰符在 NavigationLink 上收到此错误。将navigationViewStyle(StackNavigationViewStyle()) 添加到我的NavigationView 并没有解决问题。我也试过zIndex()layoutPriority() 无济于事。改用工具栏解决了我的问题。

          之前

          .navigationBarItems(trailing:
              NavigationLink(
                  destination: OtherView(),
                  label: {
                      trailingImage
                  })
              )
          

          之后

          .toolbar {
              ToolbarItem(placement: .navigationBarTrailing) {
                  NavigationLink(
                      destination: OtherView(),
                      label: {
                          trailingImage
                      })
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-23
            • 2011-11-14
            • 1970-01-01
            • 1970-01-01
            • 2011-11-26
            • 1970-01-01
            相关资源
            最近更新 更多