SwiftUI displayModeButtonItem 内部管理

Bar*_* C. 23 swiftui xcode12

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

[Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.
Run Code Online (Sandbox Code Playgroud)

目前我在应用程序的入口点设置了导航视图,就像这样

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

然后在 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)
                        })
Run Code Online (Sandbox Code Playgroud)

在 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)
                        }
                    }
Run Code Online (Sandbox Code Playgroud)

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

Sco*_*ter 22

在 iPhone 或 iPhone 模拟器上运行时,我在 Xcode 12.1 上得到了这个,但在 iPad 模拟器上没有。

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

.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)


Cod*_*der 9

使用 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")
                                })
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

现在,它为什么要这样做?

对于初学者,您可以查看此Apple 参考displayModeButtonItem了解断言所引用的内容。

或者,查看上面代码的截图。

苹果手机:

在此处输入图片说明

iPad:

在此处输入图片说明

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

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

你能做的最好的事情就是提交一个错误

FWIW,我确实查看了发行说明,但找不到任何对此的参考。


Bra*_* C. 7

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

不幸的是,这并不总是理想的解决方案,有时可能会引入另一个特定于以下情况的现有错误StackNavigationViewStyle()导航返回后所选列表行的背景颜色保持灰色


小智 5

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

要修复此错误,我只需要进行一项更改:

NavigationView{
// other code
}
.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)