在 MacOS 上构建 SwiftUI “Hello World”

Posted

技术标签:

【中文标题】在 MacOS 上构建 SwiftUI “Hello World”【英文标题】:Build SwiftUI "Hello World" on MacOS 【发布时间】:2019-06-11 12:16:19 【问题描述】:

SwiftUI“Hello World”适用于 ios,但不适用于 MacOS。

尝试构建一个简单的“Hello World”SwiftUI 示例以查看它在 Mac 上的工作原理,但我得到一个空的黑屏应用程序。

我正在使用 Xcode 11 已检查 MacOS 目标 MacOS 版本 10.15 Beta (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

【问题讨论】:

你能修复源代码吗?里面有些乱码 【参考方案1】:

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

Xcode 11 beta 不支持在项目中使用 SwiftUI 配置为使用 UIKit for Mac。

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


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

【讨论】:

非常感谢您的回答!我自己也一直在想这个。 感谢莫礼萨的澄清!您是否尝试过在 Xcode Preview 中预览 SwiftUI MacOS?我尝试了以下代码,但也没有用:#if DEBUG struct ContentView_Previews : PreviewProvider static var previews: some View Group ContentView() .previewDevice("Mac") ContentView() .previewDevice("iPad Pro (12.9-)英寸)(第三代)” @AlexandreLordelo iPad 预览工作正常,但 mac 不会出现。也许它需要另一个字符串,或者预览中还不支持它! @AlexandreLordelo 预览也修复了吗?【参考方案2】:

现在可以使用Xcode 11 beta 2:

Xcode 11 beta 支持使用 SwiftUI 进行开发。

请注意,由 Beta 1 创建的骨架应用程序(从新建项目菜单创建)将不起作用。您需要使用 Beta 2 创建的那个。

【讨论】:

【参考方案3】:

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

【讨论】:

还没能测试mac预览。你知道它的代码吗? @AlexandreLordelo Xcode 11 beta 2 & macOS 10.15 beta2,够了 谢谢!我假设您使用 Mac 作为构建目标?在 Debug 代码上定义如何,以便您可以预览 iOS 和 MacOS?【参考方案4】:

虽然 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 上运行的应用程序也是如此,但您至少可以检查应用程序的外观/运行方式。

【讨论】:

【参考方案5】:

现在这在 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”。

【讨论】:

以上是关于在 MacOS 上构建 SwiftUI “Hello World”的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Preview 不适用于 MacOS 构建,而它适用于 iOS 构建

SwiftUI:如何在 macOS 应用程序中实现编辑菜单

更新到 Xcode 13,尝试在 iOS 但不是 macOS 上运行 SwiftUI 应用程序时获得唯一的错误代码

在 macOS SwiftUI 中模拟按钮点击?

SwiftUI - 在 macOS 上翻转全局坐标空间

SwiftUI - 如何在 macOS 上隐藏窗口标题