Подкласс NSApplication в Swift

Я создал подкласс NSApplication:

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 я также изменил Application на MyApplication.

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

Не удалось найти класс: MyApplication, выход

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


person iPera    schedule 26.11.2014    source источник


Ответы (1)


Пытаться:

@objc(MyApplication)
class MyApplication: NSApplication {

ИЛИ вы должны установить Info.plist следующим образом.

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

По этому поводу нет точного документа, но это описание соответствует:

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

и это:

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

person rintaro    schedule 26.11.2014
comment
Я обнаружил, что мне нужна строка @objc(MyClassName), и при этом значение NSPrincipalClass должно быть MyClassName в Xcode 7.2 для 10.11 SDK. Больше ничего не работало. - person uchuugaka; 19.12.2015
comment
Что ж, другой подход ДЕЙСТВИТЕЛЬНО работает только с интервалом между именами, ЕСЛИ вы можете определить пространство имен. Если в названии приложения есть пробел, вам понадобится подчеркивание. Кто знает, не на английском ли это. - person uchuugaka; 19.12.2015
comment
Что касается Xcode 11.3, я могу подтвердить, что ‹string› $ (PRODUCT_NAME) .MyClass ‹/string› работает с файлом Swift. Важно не добавлять расширение. - person Alex Zavatone; 17.01.2020