Swift: попробуйте использовать замыкание вместо #selector, но не работает - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь использовать замыкатель вместо селектора, но он не работает. Печать не работает, вы можете мне помочь

Мое пользовательское действие:

final class Action: NSObject {

    private let _action: () -> ()

    init(action: @escaping () -> ()) {
        _action = action
        super.init()
    }

    @objc func action() {
        _action()
    }

}

Использование:

let menu = NSMenu()

let action = Action { print("My action") }
menu.addItem(NSMenuItem(title: "Delete", action: #selector(action.action), keyEquivalent: ""))

tableView.menu = menu

Когда я нажимаю на меню, опция удаления делаетне печатать, почему не работает?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Это невозможно, потому что селекторы - это просто имена методов, а не сами методы.

НО есть другой способ использования замыкания с # селектором

/// Target-Action helper.
final class Action: NSObject {

    private let _action: () -> ()

    init(action: @escaping () -> ()) {
        _action = action
        super.init()
    }

    @objc func action() {
        _action()
    }

}

let action1 = Action { print("action1 triggered") }

let button = UIButton()
button.addTarget(action1, action: #selector(action1.action), forControlEvents: .TouchUpInside)
0 голосов
/ 10 ноября 2019

Попробуйте установить цель для NSMenuItem. Согласно документации Apple, она не включена в инициализатор, но может быть установлена ​​позже.

let menu = NSMenu()

let action = Action { print("My action") }
var menuItem = NSMenuItem(title: "Delete", action: #selector(action), keyEquivalent: "")
menuItem.target = action // This refers to the action instance
menu.addItem(menuItem)

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