将 Swift 与 OS X 首选项面板插件一起使用
Using Swift with an OS X Preference Pane plugin
我想使用 Swift 为系统偏好设置应用构建一个 OS X 偏好面板插件,但我无法让它工作。
单击 "Next" 后,Xcode 模板不提供选择 Swift 作为语言的选项,但会自动在 Objective-C 中创建项目。
不添加任何代码或做任何其他事情,项目构建成功。如果您右键单击产品并 select "Open in External Editor",系统偏好设置将成功安装并加载偏好设置面板。
很管用!
很好,但是现在,我想使用 Swift 添加一个新的 Cocoa subclass。
接受默认值,并允许它创建桥接头。
现在,退出系统偏好设置并不添加任何代码,重建项目。和以前一样,右键单击 Product 和 "Open in External Editor".
系统偏好设置将确认替换首选项面板,并安装它,但随后加载失败。
如果您在 Finder 中显示构建的产品,除了 .prefPane 插件外,还有一个 .swiftmodule 文件夹。
我猜构建阶段或构建设置中缺少一些负责将 .swiftmodule 与包的其余部分合并的东西,但一直无法弄清楚。
添加一些使用新 class 的代码后,有必要导入
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 subclass。和以前一样,项目构建并安装,但系统偏好设置无法加载它。
// Prax.swift
import PreferencePanes
class Prax: NSPreferencePane {
override func mainViewDidLoad() {
}
}
抱歉,如果我在这个问题中使用了太多图片;这似乎是解释问题并使其易于重现的最清晰方法。可能有一个简单的解决方案。有什么想法吗?
首先,您需要启用 "Embedded Content Contains Swift" 设置,以便 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。
macOS High Sierra 引入了一个 Apple 错误。此错误现已在最新的 macOS 点版本中得到解决。有关工作示例项目,请参阅 https://github.com/klaas/QlaasSwiftPreferencesPane。
我想使用 Swift 为系统偏好设置应用构建一个 OS X 偏好面板插件,但我无法让它工作。
单击 "Next" 后,Xcode 模板不提供选择 Swift 作为语言的选项,但会自动在 Objective-C 中创建项目。
不添加任何代码或做任何其他事情,项目构建成功。如果您右键单击产品并 select "Open in External Editor",系统偏好设置将成功安装并加载偏好设置面板。
很管用!
很好,但是现在,我想使用 Swift 添加一个新的 Cocoa subclass。
接受默认值,并允许它创建桥接头。
现在,退出系统偏好设置并不添加任何代码,重建项目。和以前一样,右键单击 Product 和 "Open in External Editor".
系统偏好设置将确认替换首选项面板,并安装它,但随后加载失败。
如果您在 Finder 中显示构建的产品,除了 .prefPane 插件外,还有一个 .swiftmodule 文件夹。
我猜构建阶段或构建设置中缺少一些负责将 .swiftmodule 与包的其余部分合并的东西,但一直无法弄清楚。
添加一些使用新 class 的代码后,有必要导入 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 subclass。和以前一样,项目构建并安装,但系统偏好设置无法加载它。
// Prax.swift
import PreferencePanes
class Prax: NSPreferencePane {
override func mainViewDidLoad() {
}
}
抱歉,如果我在这个问题中使用了太多图片;这似乎是解释问题并使其易于重现的最清晰方法。可能有一个简单的解决方案。有什么想法吗?
首先,您需要启用 "Embedded Content Contains Swift" 设置,以便 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。
macOS High Sierra 引入了一个 Apple 错误。此错误现已在最新的 macOS 点版本中得到解决。有关工作示例项目,请参阅 https://github.com/klaas/QlaasSwiftPreferencesPane。