我想使用Swift为系统偏好设置应用程序构建OS X Preference Pane插件,但我无法让它工作。
单击“下一步”后,Xcode模板不提供选择Swift作为语言的选项,但会自动在Objective-C中创建项目。
无需添加任何代码 或执行任何其他操作,项目即成功构建。如果右键单击产品并选择“在外部编辑器中打开”,系统首选项将成功安装并加载首选项窗格。
它只是有效!
那很好,但现在,我想使用Swift添加一个新的Cocoa子类。
接受默认值,并允许它创建桥接标题。
现在,退出系统偏好设置和 而不添加任何代码 ,重建项目。和以前一样,右键单击“产品”和“在外部编辑器中打开”。
系统偏好设置将确认替换首选项窗格,它将安装它,但随后无法加载。
如果在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() {
}
}
很抱歉,如果我在这个问题中使用了太多图片;它似乎是解释问题并使其易于复制的最清晰方式。可能有一个简单的解决方案。有什么想法吗?
答案 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。