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 上,NavigationViewnavigationStyle 意味着您看到的 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])
                }
                
            }
    }