2014-11-26 3 views
7

Я создал NSApplication подкласс:Подкласс NSApplication в Swift

class MyApplication: NSApplication { 
    override func sendEvent(theEvent: NSEvent) { 
     if theEvent.type == NSEventType.KeyUp && (theEvent.modifierFlags & .CommandKeyMask).rawValue != 0 { 
      self.keyWindow?.sendEvent(theEvent) 
     } else { 
      super.sendEvent(theEvent) 
     } 
    } 
} 

После этого я изменил «Главный класс» в Info.plist к MyApplication и в конце в сцене приложений в Main.storyboard, я изменил приложение к MyApplication.

Когда я запускаю приложение, я получаю следующее сообщение:

Unable to find class: MyApplication, exiting 

Может кто-то помочь мне с этим?

ответ

21

Try:

@objc(MyApplication) 
class MyApplication: NSApplication { 

ИЛИ, вы должны установить info.plist как это.

<key>NSPrincipalClass</key> 
<string>YourAppName.MyApplication</string> 
     ^^^^^^^^^^^^ 

Там нет точного документа об этом, но this description is corresponding:

Для того, чтобы сохранить пространства имен, когда Swift класс используется в коде Objective-C, Swift классов подвергается Objective-C время исполнения с их полными именами. Поэтому, когда вы работаете с API-интерфейсами, которые работают с строковым представлением класса Swift, вы должны указать полное имя класса. Например, при создании Mac-приложения на основе документа вы указываете имя своего подкласса NSDocument в файле Info.plist вашего приложения. В Swift вы должны использовать полное имя вашего подкласса документа, включая имя модуля, полученное от имени вашего приложения или фреймворка.

и this:

При использовании атрибута на Swift класса @objc(<#name#>), класс доступен в Objective-C без какого-либо пространства имен.

+0

Второй вариант отлично работает. Благодарю. – iPera

+0

Life Saver почти. – uchuugaka

+0

Я нашел, что мне нужна строка '@objc (MyClassName)', и с этим значением NSPrincipalClass должно было быть 'MyClassName' на Xcode 7.2 для 10.11 SDK. Ничто другое не сработало. – uchuugaka

Смежные вопросы