Использование Swift с плагином панели настроек OS X

Я хотел бы использовать Swift для создания плагина OS X Preference Pane для приложения System Preferences, но я не могу заставить его работать.

введите описание изображения здесь

После нажатия "Далее" шаблон Xcode не предлагает выбрать Swift в качестве языка, но автоматически создает проект в Objective-C.

введите описание изображения здесь

Без добавления какого-либо кода или чего-либо еще, проект успешно собирается. Если вы щелкнете правой кнопкой мыши по Продукту и выберете "Открыть во внешнем редакторе", Системные настройки успешно установятся и загрузят панель настроек.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Это просто работает!

Ну, это здорово, но теперь я хочу добавить новый подкласс Cocoa, используя Swift.

введите описание изображения здесь

введите описание изображения здесь

Примите значение по умолчанию и разрешите ему создать заголовок моста.

введите описание изображения здесь

Теперь выйдите из Системных настроек и без добавления кода пересоберите проект. Как и раньше, щелкните правой кнопкой мыши на Product и выберите "Open in External Editor".

Системные настройки подтвердят замену панели настроек и установят ее, но затем она не загрузится.

введите описание изображения здесь

введите описание изображения здесь

Если вы показываете встроенный продукт в 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 и просто реализовать подкласс NSPreferencePane в Swift. Как и прежде, проект собирается и устанавливается, но Системные настройки не загружают его.

//  Prax.swift

import PreferencePanes

class Prax: NSPreferencePane {

    override func mainViewDidLoad() {

    }
}

Извините, если я использовал слишком много картинок в этом вопросе; казалось, что это самый ясный способ объяснить проблему и облегчить ее воспроизведение. Там, вероятно, простое решение. Есть идеи?

2 ответа

Решение

Во-первых, вам нужно включить параметр "Embedded Content Contains Swift", чтобы Xcode скопировал необходимые библиотеки Swift в пакет.

Затем вы получите эту ошибку:

Системные настройки [68872]: сбой dlopen_preflight с
  dlopen_preflight(/.../preftest.prefPane/ Содержание /MacOS/preftest):

  Библиотека не загружена: @ rpath / libswiftAppKit.dylib
    Ссылка от: /.../preftest.prefPane/Contents/MacOS/preftest  
    Причина: изображение не найдено для /.../preftest.prefPane

Это означает, что приложение не знает, откуда загрузить включенные библиотеки Swift.

Чтобы это исправить, добавьте @loader_path/../Frameworks к путям поиска пути выполнения в настройках сборки, сообщая, что библиотеки Swift находятся в каталоге Frameworks вашей предварительной панели:

Смотрите страницу руководства dyld для получения дополнительной информации о динамической загрузке.

В macOS High Sierra была обнаружена ошибка Apple. Эта ошибка теперь исправлена ​​в последней версии macOS. См. https://github.com/klaas/QlaasSwiftPreferencesPane для рабочего примера проекта.

Другие вопросы по тегам