在 MacOS 上构建 SwiftUI "Hello World"

Build SwiftUI "Hello World" on MacOS

SwiftUI "Hello World" 适用于 iOS,但不适用于 MacOS。

尝试构建一个简单的 "Hello World" SwiftUI 示例以查看其在 Mac 上的工作方式,但我得到一个空的黑屏应用程序。

我正在使用 Xcode 11 MacOS 目标已检查 MacOS 版本 10.15 测试版 (19A471t)

import SwiftUI

struct ContentView : View {
    var body: some View {
        VStack {
            Toggle(isOn: /*@START_MENU_TOKEN@*/.constant(true)/*@END_MENU_TOKEN@*/) {
                Text(/*@START_MENU_TOKEN@*/"Toggle"/*@END_MENU_TOKEN@*/)
            }
            Stepper(value: /*@START_MENU_TOKEN@*/.constant(4)/*@END_MENU_TOKEN@*/, in: /*@START_MENU_TOKEN@*/1...10/*@END_MENU_TOKEN@*/) {
                /*@START_MENU_TOKEN@*/Text("Stepper")/*@END_MENU_TOKEN@*/
            }
            Text("Hello World")
        }
    }
}

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

这是一个已知问题,在 Xcode 11 Beta Release Notes 中提到:

Xcode 11 beta doesn’t support working with SwiftUI in a project configured to use UIKit for Mac.

所以我们唯一的选择就是等到下一个 Xcode 11 测试版发布。


更新:这适用于 Xcode 11.0 beta 2。

虽然 Xcode 11 beta 1 缺少支持是一个已知问题,但您可以通过更改 SceneDelegate willConnectTo 方法中的场景设置来启用它:

#if targetEnvironment(UIKitForMac)
    let windowScene = UIWindowScene(session: session, connectionOptions: connectionOptions)
    let window = UIWindow(windowScene: windowScene)
#else
    let window = UIWindow(frame: UIScreen.main.bounds)
#endif
    window.rootViewController = UIHostingController(rootView:
      ContentView()
        .environmentObject(TimersStore.shared)
        .environmentObject(SettingsStore.shared)
    )

我已保护此代码,因为出于某种原因,如果您在 iOS/iPadOS 目标上使用 UIWindowScene,它会导致键盘不再出现并且文本输入不起作用。 macOS 上的应用程序 运行 也是如此,但您至少可以检查您的应用程序的外观/运行方式。

现在 Xcode 11 beta 2 可以了:

Xcode 11 beta supports development with SwiftUI.

请注意,Beta 1 创建的骨架应用(从“新建项目”菜单创建)将无法运行。您需要使用 Beta 2 创建的那个。

它在 Xcode 11 beta 2 和 macOS 10.15 beta2 上运行良好。

现在在 SwiftUI 中这非常简单:

import SwiftUI

struct ContentView: View {
    #if targetEnvironment(macCatalyst)
    var body: some View {
        Text("Hello, Mac!")
    }
    #else
    var body: some View {
        Text("Hello, iOS!")
    }
    #endif
}

确保您在部署信息目标中选中 "Mac"。