Использование Swift с плагином панели предпочтений OS X
Я бы хотел использовать Swift для создания плагина панели предпочтений OS X для приложения "Системные настройки", но я не могу заставить его работать.
![введите описание изображения здесь]()
После нажатия "Далее" шаблон Xcode не предлагает выбор Swift как языка, но автоматически создает проект в Objective-C.
![введите описание изображения здесь]()
Без добавления какого-либо кода или что-либо еще, проект будет успешно выполнен. Если вы щелкните правой кнопкой мыши на Продукте и выберите "Открыть во внешнем редакторе", системные настройки успешно установят и загрузят панель предпочтений.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Он просто работает!
Хорошо, что здорово, но теперь я хочу добавить новый подкласс Cocoa с помощью Swift.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Принятие значения по умолчанию и возможность создания заголовка моста.
![введите описание изображения здесь]()
Теперь, закройте Системные настройки и без добавления кода, перестройте проект. Как и прежде, щелкните правой кнопкой мыши Продукт и "Открыть во внешнем редакторе".
Системные настройки подтвердят замену панели предпочтений, и она ее установит, но затем она не загружается.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Если вы показываете встроенный продукт в Finder, в дополнение к плагину .prefPane, также есть папка .swiftmodule.
![введите описание изображения здесь]()
Я предполагаю, что в фазах сборки или настройках сборки что-то не хватает, которые отвечают за включение модуля .swift с остальной частью пакета, но не смогли понять это.
После добавления кода, который использует новый класс, необходимо импортировать
заголовок зонтика 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() {
}
}
Извините, если я использовал слишком много изображений в этом вопросе; это казалось самым ясным способом объяснить проблему и облегчить ее воспроизведение. Вероятно, это простое решение. Любые идеи?
Ответы
Ответ 1
Во-первых, вам нужно включить параметр "Встроенный контент 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 находятся в каталоге Frameworks вашего префикса:
![]()
Подробнее о динамической загрузке см. dyld man page.