Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示
Posted
技术标签:
【中文标题】Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示【英文标题】:Swiftui [BUG] NavigationView and List not showing on iPad simulator only 【发布时间】:2019-12-14 20:05:28 【问题描述】:各种iPad模拟器上的空白页
到苹果开发者网站下载以下教程项目:
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)
【问题讨论】:
【参考方案1】:它实际上工作得很好。默认情况下,在 iPad 上,NavigationView
中的 navigationStyle
表示您看到的 detail 视图带有折叠的 master 视图。尝试旋转设备或模拟器,然后您将看到您的主列表。选择一个项目会将其推送到详细信息视图中。或者,从左边缘向右滑动,您的列表就会出现。
不喜欢这种行为?您可以将导航视图的navigationStyle
设置为StackNavigationViewStyle()
。在任何给定时间,它只会在顶部显示一个视图。
我目前找不到始终显示主视图的选项,因为目前我的应用程序是使用 UISplitViewController
配置的。这可能是暂时的情况。
【讨论】:
嗨@Procrastin8,是的,旋转设备会看到视图,但这对我来说仍然不好,它表现得有点奇怪。添加StackNavigationViewStyle()
是一种解决方案,但是整个视图不再是纵向,不符合我的设计要求。但你的答案是显示的东西,谢谢。
嗨@Procrastin8,你有其他我们可以尝试的风格吗?使用StackNavigationViewStyle()
会使用户界面在屏幕更大的 Mac 和 iPad 上看起来不太好。我喜欢原来的风格
现在严重缺乏定制。如果您真的需要这种行为(对我来说这是合理的!),您需要将 UISplitViewController
包装为 UIViewControllerRepresentable
并手动完成。希望 Apple 能尽快解决这些缺陷。【参考方案2】:
根据@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)
截图
【讨论】:
【参考方案3】:当我第一次在 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])
【讨论】:
以上是关于Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示的主要内容,如果未能解决你的问题,请参考以下文章
Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示
从 React-native-navigation v1 到现有项目的 react-native-navigation v2
Xcode预览(Preview)显示List视图内容的一个Bug及解决