运行 在 Xcode 模拟器上预览

Run previews on Xcode simulator

我正在使用 Xcode 11 来测试 swiftUI,但我无法让我的 Content_Previews 正常工作。我的代码类似于introductory talk given by Apple

由于我没有 MacOS Catalina,我正在使用模拟器和真实设备对此进行测试。我无法使用我的 testData 查看 DEBUG 预览。

ContentView.swift 看起来像:

import SwiftUI

struct ContentView: View {
    var devices: [Device] = []

    var body: some View {
            NavigationView {
                List(devices) { device in
                    Image(systemName: "gamecontroller")
                    VStack() {
                        Text(device.name)
                        if(device.isConnected){
                            Text("Connected").font(.subheadline).foregroundColor(.secondary)
                        }else{
                            Text("Not Connected").font(.subheadline).foregroundColor(.secondary)
                        }
                    }
                }
                .navigationBarTitle(Text("Devices"))
            }
  }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(devices: testData)
    }
}
#endif

那么,设备结构如下:

import SwiftUI

struct Device : Identifiable {
    var id = UUID()
    var name: String
    var isConnected: Bool = false
}


let testData = [
    Device(name: "devA"),
    Device(name: "devB"),
    Device(name: "devC")
]

不知何故,ContentView_Previews 没有执行,即使 DEBUG 开启。 (我测试了这个放置条件文本视图)。知道出了什么问题吗?我的猜测是 PreviewProvider ContentView_Previews 没有被调用,我缺少一些配置。

Xcode 仅支持 macOS Catalina (10.15) 或更高版本上的 SwiftUI 预览。它可以在 Mojave 上编译符合 PreviewProvider 的类型,但不会渲染它们。

有两种方法可以在 Mojave 上渲染 SwiftUI 视图:在模拟器中(如您所见),或在 playground 中。

这是一个示例 iOS playground,它适用于 macOS Mojave 10.14.6 上的 Xcode 11 beta 4:

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text(verbatim: "Hello \(ProcessInfo.processInfo.operatingSystemVersionString)")
                .lineLimit(nil)
                .padding()
                .background(Color.pink.opacity(0.2).cornerRadius(12))
                .border(Color.red, width: 2, cornerRadius: 12)
        }
    }
}

import PlaygroundSupport

let host = UIHostingController(rootView: ContentView())
host.preferredContentSize = .init(width: 200, height: 200)
PlaygroundPage.current.liveView = host

结果: