xcode - 将 Swift 与 OS X 首选项面板插件一起使用

标签 xcode macos swift system-preferences nspreferencepane

我想使用 Swift 为系统偏好设置应用构建一个 OS X 偏好面板插件,但我无法让它工作。

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

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

    }
}

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

最佳答案

首先,您需要启用“嵌入的内容包含 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 添加到build设置中的运行路径搜索路径中,告诉它 Swift 库位于您的 prefpane 的 Frameworks 目录中:

参见 dyld man page有关动态加载的更多信息。

关于xcode - 将 Swift 与 OS X 首选项面板插件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43644753/

相关文章:

objective-c - 从 NSURL 设置 NSImageView 的 NSImage

mysql - 将 mysql 日期转换为 NSDate

ios - UIPickerView:在展开可选值时意外发现 nil

java - 尝试加载 qdap 包时出现 R 错误

xcode - Interface Builder XIB 错误 - 无法写入路径

ios - 从存档导出 ipa 时 Xcode 9 崩溃

c++ - 使用 Xcode 9.0 with clang 时出现编译错误(生成多个输出文件时不能指定 -o)

node.js - 如何在 Mac 上安装 NVM

iOS 8 Swift - 是否需要将所有属性值设置为持久化?

objective-c - 快速找到 gdb 中断言的线程的方法?