Элементы контекстного меню FinderSync подают звуковой сигнал, никогда не вызывают действие - PullRequest
0 голосов
/ 08 января 2019

Я хочу создать меню, которое будет вызывать функции для класса, отличного от того, который создал меню, и затем поместить его в Finder. Однако, когда я щелкаю по пункту меню, звучит системный сигнал об ошибке, и моя функция никогда не вызывается.

Вот SSCCE:

import Cocoa
import FinderSync



@objc(FinderSync)
class FinderSync: FIFinderSync {

    var observedFolder = URL(fileURLWithPath: "/")


    override init() {
        super.init()

        NSLog("\(FinderSync.self.className()) launched from \(Bundle.main.bundlePath)")

        // Set up the directory we are syncing.
        FIFinderSyncController.default().directoryURLs = [self.observedFolder]
    }



    // MARK: - Menu and toolbar item support

    override var toolbarItemName: String {
        return "Wonderful Test App"
    }


    override var toolbarItemToolTip: String {
        return "This is wonderful"
    }


    override var toolbarItemImage: NSImage {
        return NSImage(named: NSImage.cautionName)!
    }


    override func menu(for menuKind: FIMenuKind) -> NSMenu {
        let menu = NSMenu(title: "")
        let menuItem = NSMenuItem(title: "Click me!", action: #selector(SomeOtherClass.remoteAction), keyEquivalent: "")
        menuItem.target = SomeOtherClass.shared
        menuItem.action = #selector(SomeOtherClass.remoteAction)
        menu.addItem(menuItem)
        return menu
    }
}



@objc(SomeOtherClass)
public class SomeOtherClass: NSObject {

    public static let shared = SomeOtherClass()


    deinit {
        NSLog("Deallocated!")
        preconditionFailure("Shared instance should never be deallocated!")
    }


    @IBAction
    @objc(remoteAction:)
    public func remoteAction(_ sender: Any?) {
        NSLog("Remote!")
    }
}

Я подтвердил с помощью отладчика памяти, что SomeOtherClass.shared все еще находится в памяти до, во время и после щелчка по пункту меню, поэтому он не был освобожден или что-то еще.

1 Ответ

0 голосов
/ 08 января 2019

Похоже, вы не можете добавлять действия внутри какого-либо класса, кроме основного класса вашего расширения FinderSync. Что примерно так же глупо, как и все остальное в отношении NSMenuItem, поэтому я не удивлен.

Итак, вам придется переместить действие (я) в ваш FinderSync класс, несмотря на то, насколько уродливым это может быть для организации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...