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
})
}
}
每次导航到另一个屏幕时,我都会在控制台中收到此消息:
[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
})
}
}