Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示
Swiftui [BUG] NavigationView and List not showing on iPad simulator only
各种iPad模拟器上的空白页
前往 Apple 开发者网站下载以下教程项目:
https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
运行 这在任何 iPad 模拟器上,你只会得到一个空白页面,但代码在 Mac/iPhone 的模拟器和我的真实 iPhone 设备上工作正常.
这绝对是一个错误,我已经向 Apple 报告了,我在这里发帖只是想让像我这样的人说这个问题,请不要在重置模拟器、检查代码、重启你的设备上浪费时间笔记本电脑,等苹果来解决这个问题。
截图
来自 Apple SwiftUI 教程项目的示例代码:
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
}
}
它实际上工作得很好。默认情况下,在 iPad 上,NavigationView
的 navigationStyle
意味着您看到的 detail 视图具有折叠的 master 查看。尝试旋转设备或模拟器,然后您将看到您的主列表。选择一个项目会将其推送到详细视图。或者,从左边缘向右滑动,您的列表就会出现。
不喜欢这种行为?您可以将导航视图的 navigationStyle
设置为 StackNavigationViewStyle()
。在任何给定时间,它只会在顶部显示一个视图。
我目前找不到始终显示主视图的选项,因为目前我的应用是使用 UISplitViewController
配置的。这可能是暂时的情况。
根据@Procrastin8的回答,我这里是展示示例代码,你只需要添加一行代码.navigationViewStyle(StackNavigationViewStyle()
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}.navigationViewStyle(StackNavigationViewStyle())
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
}
}
截图
当我第一次在 iPad 上看到我的应用程序时,我也被推迟了。但后来我意识到不把所有屏幕都浪费在 List
上是有意义的,所以我默认在详细视图中显示第一个项目:
var body: some View {
NavigationView {
// Main view (by default shows on iPhone but not on iPad)
VStack{
List {
ForEach(viewModel.arPictures, id: \.date) { potd in
NavigationLink(destination: POTDDetailView(potd: potd)) {
Text(potd.title ?? "")
}
}
}
}.navigationBarTitle(Text("Last 8 days pictures"), displayMode: .inline)
// Detail view (by default shows on iPad but not on iPhone)
if (!viewModel.arPictures.isEmpty){
POTDDetailView(potd: viewModel.arPictures[0])
}
}
}
各种iPad模拟器上的空白页
前往 Apple 开发者网站下载以下教程项目:
https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
运行 这在任何 iPad 模拟器上,你只会得到一个空白页面,但代码在 Mac/iPhone 的模拟器和我的真实 iPhone 设备上工作正常.
这绝对是一个错误,我已经向 Apple 报告了,我在这里发帖只是想让像我这样的人说这个问题,请不要在重置模拟器、检查代码、重启你的设备上浪费时间笔记本电脑,等苹果来解决这个问题。
截图
来自 Apple SwiftUI 教程项目的示例代码:
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
}
}
它实际上工作得很好。默认情况下,在 iPad 上,NavigationView
的 navigationStyle
意味着您看到的 detail 视图具有折叠的 master 查看。尝试旋转设备或模拟器,然后您将看到您的主列表。选择一个项目会将其推送到详细视图。或者,从左边缘向右滑动,您的列表就会出现。
不喜欢这种行为?您可以将导航视图的 navigationStyle
设置为 StackNavigationViewStyle()
。在任何给定时间,它只会在顶部显示一个视图。
我目前找不到始终显示主视图的选项,因为目前我的应用是使用 UISplitViewController
配置的。这可能是暂时的情况。
根据@Procrastin8的回答,我这里是展示示例代码,你只需要添加一行代码.navigationViewStyle(StackNavigationViewStyle()
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}.navigationViewStyle(StackNavigationViewStyle())
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
}
}
截图
当我第一次在 iPad 上看到我的应用程序时,我也被推迟了。但后来我意识到不把所有屏幕都浪费在 List
上是有意义的,所以我默认在详细视图中显示第一个项目:
var body: some View {
NavigationView {
// Main view (by default shows on iPhone but not on iPad)
VStack{
List {
ForEach(viewModel.arPictures, id: \.date) { potd in
NavigationLink(destination: POTDDetailView(potd: potd)) {
Text(potd.title ?? "")
}
}
}
}.navigationBarTitle(Text("Last 8 days pictures"), displayMode: .inline)
// Detail view (by default shows on iPad but not on iPhone)
if (!viewModel.arPictures.isEmpty){
POTDDetailView(potd: viewModel.arPictures[0])
}
}
}