在 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 构建