SwiftUI displayModeButtonItem 是内部管理的

SwiftUI displayModeButtonItem is internally managed

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

[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)
                        }
                    }

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

使用 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 不显示。

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

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

FWIW,我确实查看了 release notes,但找不到任何参考资料。

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

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

.navigationViewStyle(StackNavigationViewStyle())

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

不幸的是,这并不总是一个理想的解决方案,有时会引入另一个特定于 StackNavigationViewStyle() 的现有错误,其中:.

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

要修复此错误,我只需要做一个更改:

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

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

之前

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

之后

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