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 模拟器上不显示

Bug with Mapbox and SwiftUI

从 React-native-navigation v1 到现有项目的 react-native-navigation v2

Xcode预览(Preview)显示List视图内容的一个Bug及解决

Xcode预览(Preview)显示List视图内容的一个Bug及解决

SwiftUI 教程 PresentationButton 错误