2015-08-17 16 views
10

Tôi muốn sử dụng Swift để xây dựng một plugin PX Preference Pane cho ứng dụng System Preferences, nhưng tôi không thể làm cho nó hoạt động.Sử dụng Swift với plugin OS X Preference Pane plugin

enter image description here

Sau khi nhấp "Next" mẫu Xcode không cung cấp một tùy chọn để chọn Swift như một ngôn ngữ, nhưng tự động tạo ra các dự án trong Objective-C.

enter image description here

Nếu không có thêm bất kỳ mã hoặc làm bất cứ điều gì khác, dự án xây dựng thành công. Nếu bạn nhấp chuột phải vào Sản phẩm và chọn "Mở trong Trình chỉnh sửa bên ngoài", Tùy chọn hệ thống sẽ cài đặt thành công và tải ngăn tùy chọn.

enter image description here

enter image description here

enter image description here

Nó chỉ hoạt động!

Điều đó thật tuyệt, nhưng bây giờ, tôi muốn thêm lớp con Cocoa mới bằng Swift.

enter image description here

enter image description here

Chấp nhận mặc định, và cho phép nó để tạo ra các Bridging Header.

enter image description here

Bây giờ, bỏ System Preferences và mà không cần thêm bất kỳ mã, xây dựng lại dự án. Như trước đây, nhấp chuột phải vào Sản phẩm và "Mở trong Trình chỉnh sửa bên ngoài".

Tùy chọn hệ thống sẽ xác nhận thay thế ngăn tùy chọn và cài đặt, nhưng không tải được.

enter image description here

enter image description here

Nếu bạn hiển thị các sản phẩm xây dựng trong Finder, ngoài các plugin .prefPane, cũng có một thư mục .swiftmodule.

enter image description here

Tôi đoán có điều gì đó mất tích trong giai đoạn xây dựng hoặc xây dựng Cài đặt đó là chịu trách nhiệm về kết hợp .swiftmodule với phần còn lại của bó, nhưng đã không thể để con nó ra.

Sau khi bạn thêm một số mã sử dụng lớp mới, cần nhập tiêu đề ô dự án Swift ("Prax-Swift.h") để biên dịch dự án, nhưng nhập tiêu đề ô không sửa lỗi này vấn đề.

// Prax.h 

#import <PreferencePanes/PreferencePanes.h> 
#import "Prax-Swift.h" 

@interface Prax : NSPreferencePane 

@property PraxObject *ourPrax; 

- (void)mainViewDidLoad; 

@end 

Tôi cũng đã thử xóa Prax.h và Prax.m và chỉ cần triển khai lớp con NSPreferencePane trong Swift. Như trước đây, dự án xây dựng và cài đặt, nhưng System Preferences không tải được.

// Prax.swift 

import PreferencePanes 

class Prax: NSPreferencePane { 

    override func mainViewDidLoad() { 

    } 
} 

Xin lỗi nếu tôi đã sử dụng quá nhiều ảnh trong câu hỏi này; nó dường như là cách rõ ràng nhất để giải thích vấn đề và làm cho nó dễ tái tạo. Có lẽ có một giải pháp đơn giản. Bất kỳ ý tưởng?

+1

Bạn đã xem ứng dụng Console chưa? Rất có thể bạn sẽ tìm thấy một thông báo lỗi ở đó. – zneak

+0

Không, không có thông báo lỗi hiển thị trong Bảng điều khiển. Có các thông báo hoạt động của Tùy chọn hệ thống, phản ánh "Hiển thị tất cả" và các khay tùy chọn khác được truy cập, nhưng không có thông tin nào không tải được. Tôi sẽ không mong đợi nó đưa ra nhiều đầu mối về vấn đề này, vì có vẻ như là một thứ gì đó về Xcode không xây dựng gói plugin một cách chính xác. – ElmerCat

Trả lời

8

Trước tiên, bạn cần phải bật cài đặt "Nội dung nhúng có chứa Swift" để Xcode sẽ sao chép các thư viện Swift cần thiết vào gói.

Sau đó, bạn nhận được lỗi này:

 
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 

này có nghĩa là ứng dụng không biết được nơi để tải các thư viện Swift bao gồm từ.

Để sửa lỗi này, thêm @loader_path/../Frameworks đến các đường dẫn tìm kiếm runpath trong các thiết lập xây dựng, nói với nó rằng các thư viện Swift nằm trong thư mục Khung của prefpane của bạn:

Xem dyld man page để biết thêm về tải động.

+0

Điều đó cũng yêu cầu thêm một giai đoạn sao chép tệp sao cho thư viện Swift sẽ nằm trong thư mục Frameworks? –

+0

Rất tiếc, vâng, tôi đã quên. Đang chỉnh sửa ... – jtbandes

+0

Tuyệt! Tất cả những gì tôi phải làm là bật công tắc cho "Nội dung nhúng chứa mã Swift". Đường dẫn tìm kiếm thời gian chạy đã có sẵn và tôi không phải thêm giai đoạn sao chép tệp. Cảm ơn, jtbandes! – ElmerCat

Các vấn đề liên quan