将Swift与OS X首选项窗格插件

时间:2015-08-17 01:41:05

标签: xcode macos swift system-preferences nspreferencepane

我想使用Swift为系统偏好设置应用程序构建OS X Preference Pane插件,但我无法让它工作。

enter image description here

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

enter image description here

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

enter image description here

enter image description here

enter image description here

它只是有效!

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

enter image description here

enter image description here

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

enter image description here

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

系统偏好设置将确认替换首选项窗格,它将安装它,但随后无法加载。

enter image description here

enter image description here

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

enter image description here

我猜测在构建阶段或构建设置中缺少一些东西,它负责将.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() {

    }
}

很抱歉,如果我在这个问题中使用了太多图片;它似乎是解释问题并使其易于复制的最清晰方式。可能有一个简单的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

首先,您需要启用&#34;嵌入式内容包含Swift&#34;设置,以便Xcode将必要的Swift库复制到包中。

然后,您收到此错误:

System Preferences[68872]: dlopen_preflight failed with
  dlopen_preflight(/.../preftest.prefPane/Contents/MacOS/preftest):

  Library not loaded: @rpath/libswiftAppKit.dylib
    Referenced from: /.../preftest.prefPane/Contents/MacOS/preftest  
    Reason: image not found for /.../preftest.prefPane

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

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

有关动态加载的详细信息,请参阅dyld man page

答案 1 :(得分:0)

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