Использование 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 для рабочего примера проекта.