UIKit for Mac中不存在“ NSApp”:如何在macOS的iOS应用中嵌入仅Mac框架?

Zel*_*lko 10 macos cocoa uikit appkit ios

Mac版UIKit

我正在探索Xcode 11和macOS Catalina的新可能性,以使用UIKit创建Mac版本的iPad应用程序。通常按预期工作。

什么是最好的方式定制NSWindow在在MacOS iOS应用程序?


超越复选框

https://developer.apple.com/documentation/uikit/creating_a_mac_version_of_your_ipad_app

您可以使用相同的方法来包含仅在macOS中可用的框架和代码。对于框架,请选择macOS作为平台设置,并使用#if targetEnvironment(UIKitForMac)语句将代码括起来。

首先,我创建了一个基本的macOS框架(例如MacMan.framework)来配置Mac特定的行为。

尽管尽了最大的努力,但我还是遇到了错误:

  • Mac版的UIKit中无法使用“ NSApp”
  • Mac OS的UIKit中没有'NSWindow'
  • 为Mac构建UIKit,但为macOS构建链接框架“ MacMan.framework”。您可能需要配置“ MacMan.framework”以针对Mac的UIKit进行构建,或者限制在目标编辑器中应链接此框架的平台。

相反似乎正确(易于排除代码)

#if !targetEnvironment(UIKitForMac)

override var prefersHomeIndicatorAutoHidden: Bool {
    return true
}

#endif
Run Code Online (Sandbox Code Playgroud)

参考文献:

https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit

jva*_*ela 5

根据Apple的说法,如果您的应用程序依赖于为macOS构建的框架,则您需要将其从任何iOS版本中排除,或者需要为iOS和macOS重建它,以便可以对仅在iOS或macOS中可用。为此,Apple建议您将其转换为xcframework。由于您所依赖的框架指向NSAppNSWindow,它们是iOS上不可用的符号,因此您会遇到提到的错误。

因此,如果您具有的源代码,则MacMan.framework需要对其进行处理,以xcframework通过条件化依赖于特定平台的代码将其转换为,因为它们引用的是其他平台上不可用的框架。

如果您不拥有源代码,则需要与框架的供应商联系以为您提供这样的二进制文件。如果这不可能,那么您将必须排除MacMan.framework专门为macOS平台构建的。

这一切在WWDC 2019的视频中进行了解释,该视频名为“ 为Mac引入iPad应用程序 ”。

此外,我还建议您查看同一页面上的相关视频以了解操作。最后,要学习如何构建xcframework,请观看视频“ Swift中的Binary Frameworks ”。不要被后面的视频标题所迷惑:如果需要,您也可以在Objective-C中构建xcframeworks。

如果您需要自定义窗口背景,则不能通过NSWindow来实现。正如我在上面解释的那样,该API不可用,但您需要使用其iOS对应版本:UIWindow。在这种情况下,您可以像这样更改窗口背景:

self.view.window.backgroundColor = .red
Run Code Online (Sandbox Code Playgroud)

自我就是您的UIViewController。

另一种可能的自定义方法是添加工具栏,因为NSToolbar现在通过以下方式导出:

let toolbar = UIWindowScene.titlebar.toolbar
Run Code Online (Sandbox Code Playgroud)

此处解释了更完整的解释以及在Mac版UIKit应用中添加和自定义NSToolbar的警告。