12

我想使用 Swift 为 System Preferences 应用程序构建一个 OS X Preference Pane 插件,但我无法让它工作。

在此处输入图像描述

单击“下一步”后,Xcode 模板不提供选择 Swift 作为语言的选项,而是自动在 Objective-C 中创建项目。

在此处输入图像描述

无需添加任何代码或执行任何其他操作,项目即可成功构建。如果您右键单击产品并选择“在外部编辑器中打开”,系统首选项将成功安装并加载首选项窗格。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

它只是工作!

很好,但是现在,我想使用 Swift 添加一个新的 Cocoa 子类。

在此处输入图像描述

在此处输入图像描述

接受默认值,并允许它创建桥接头。

在此处输入图像描述

现在,退出系统偏好设置,不添加任何代码,重建项目。和以前一样,右键单击产品并“在外部编辑器中打开”。

System Preferences 将确认替换首选项窗格,并将安装它,但随后无法加载。

在此处输入图像描述

在此处输入图像描述

如果您在 Finder 中显示构建的产品,除了 .prefPane 插件之外,还有一个 .swiftmodule 文件夹。

在此处输入图像描述

我猜在构建阶段或构建设置中缺少一些负责将 .swiftmodule 与捆绑包的其余部分合并的东西,但无法弄清楚。

添加一些使用新类的代码后,需要导入 Swift 项目伞头文件(“Prax-Swift.h”)以使项目编译,但导入伞头文件并不能解决此问题。

//  Prax.h

#import <PreferencePanes/PreferencePanes.h>
#import "Prax-Swift.h"

@interface Prax : NSPreferencePane

@property PraxObject *ourPrax;

- (void)mainViewDidLoad;

@end

我还尝试删除 Prax.h 和 Prax.m 并在 Swift 中简单地实现 NSPreferencePane 子类。和以前一样,项目构建并安装,但系统偏好设置无法加载它。

//  Prax.swift

import PreferencePanes

class Prax: NSPreferencePane {

    override func mainViewDidLoad() {

    }
}

对不起,如果我在这个问题中使用了太多图片;这似乎是解释问题并使其易于重现的最清晰方法。可能有一个简单的解决方案。有任何想法吗?

4

2 回答 2

8

首先,您需要启用“Embedded Content Contains Swift”设置,以便 Xcode 将必要的 Swift 库复制到包中。

然后,您会收到此错误:

系统偏好设置[68872]:dlopen_preflight 失败
  dlopen_preflight(/.../preftest.prefPane/Contents/MacOS/preftest):

  未加载库:@rpath/libswiftAppKit.dylib
    引用自:/.../preftest.prefPane/Contents/MacOS/preftest  
    原因:找不到/.../preftest.prefPane 的
图像

这意味着应用程序不知道从哪里加载包含的 Swift 库。

要解决此问题,@loader_path/../Frameworks请在构建设置中添加运行路径搜索路径,告诉它 Swift 库位于您的 prefpane 的 Frameworks 目录中:

有关动态加载的更多信息,请参见dyld 手册页

于 2015-08-17T03:10:26.917 回答
0

macOS High Sierra 引入了一个 Apple 错误。此错误现已在 macOS 的最新 dot 版本中得到解决。有关工作示例项目,请参阅https://github.com/klaas/QlaasSwiftPreferencesPane 。

于 2018-04-13T12:38:44.490 回答