UIMenuItem не отображается в таблице

Я пытаюсь добавить пользовательское действие в UIMenuController для использования на UITableViewCell, но оно не появляется при отображении меню.

Изменить: исправлен код.

Скриншот Вот код:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    override func viewDidLoad() {
        ...
        UIMenuController.shared.menuItems = [UIMenuItem(title: "Test", action: #selector(test))]
        UIMenuController.shared.update()
    }

    // Table view setup
    // ...
    func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        return action == #selector(copy(_:)) || action == #selector(test)
    }
    func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(test)
    }

    @objc func test() {
        print("Hello, world!")
    }
}

person Lakhan Mankani    schedule 06.08.2018    source источник
comment
UIMenuController.menuVisible = true myMenuController.arrowDirection = UIMenuControllerArrowDirection.Down // установить прямоугольник, просмотреть myMenuController.setTargetRect(CGRectZero, inView: self.view)   -  person Prissy Eve    schedule 06.08.2018
comment
Это ничего не сделало.   -  person Lakhan Mankani    schedule 06.08.2018
comment
stackoverflow.com/questions/28234921/ - вы попробуете эту ссылку   -  person Prissy Eve    schedule 06.08.2018


Ответы (1)


  1. Ваша функция test должна находиться в подклассе UITableViewCell.
  2. Вам нужно реализовать canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool в этом подклассе UITableViewCell и вернуть return action == #selector(test)
  3. В UIMenuController.shared.menuItems = [UIMenuItem(title: "Test", action: #selector(test))] измените #selector(test) на #selector(YourCellSubclass.test).
  4. Сохраните методы UITableViewDelegate, которые у вас есть в вашем контроллере представления, и измените || action == #selector(test) на || action == #selector(YourCellSubclass.test)

EDIT: добавлен рабочий пример.

Вьюконтроллер:

class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIMenuController.shared.menuItems = [UIMenuItem(title: "Test", action: #selector(MyCell.test))]
        UIMenuController.shared.update()

        tableView.register(MyCell.self, forCellReuseIdentifier: "my")
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "my", for: indexPath) as! MyCell
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    }

    override func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        return action == #selector(MyCell.test)
    }

    override func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
        // needs to be here
    }

}

Клетка:

class MyCell: UITableViewCell {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(test)
    }

    @objc func test() {
        print("works")
    }

}

введите здесь описание изображения

person Zdeněk Topič    schedule 06.08.2018
comment
Это все еще не работает. Смотрите мое редактирование для моего пересмотренного кода. - person Lakhan Mankani; 06.08.2018
comment
@LakhanMankani Я добавил рабочий пример в свой ответ. - person Zdeněk Topič; 06.08.2018