Swiftui [BUG] NavigationView和列表仅在iPad模拟器上不显示

时间:2019-12-14 20:05:28

标签: swift swiftui swiftui-list

各种iPad模拟器上的空白页

访问Apple开发人员网站以下载以下教程项目:

https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation

在任何iPad模拟器上运行此命令,您只会得到一个空白页,但是该代码在Mac / iPhone和我的真实iPhone设备的模拟器上可以正常工作。

这绝对是一个错误,我已经报告给Apple了,我在这里发布的只是想要像我这样说过的ppl,请不要浪费时间在重置模拟器,检查代码,重新启动笔记本电脑上,等到苹果解决这个问题。

屏幕截图

enter image description here

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)
        }
    }
}

3 个答案:

答案 0 :(得分:1)

实际上工作正常。默认情况下,在iPad上,navigationStyle的{​​{1}}表示您看到的 detail 视图带有折叠的 master 视图。尝试旋转设备或模拟器,然后您将看到主列表。选择一个项目会将其推入详细视图。或者,从左边缘向右轻扫,您的列表就会出现。

不喜欢这种行为吗?您可以将导航视图的NavigationView设置为navigationStyle。在任何给定时间,它只会在顶部显示一个视图。

我目前找不到始终显示主视图的选项,因为当前是使用StackNavigationViewStyle()配置我的应用的方式。这可能是暂时的情况。

答案 1 :(得分:0)

根据@ 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)
        }
    }
}

屏幕截图

enter image description here

答案 2 :(得分:0)

当我第一次在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])
                }
                
            }
    }

enter image description here