Обновление пунктов меню в UIMenuController - PullRequest
0 голосов
/ 10 октября 2018

Я хочу обновить пункты меню в контроллере пункта меню таблицы, так как теперь я получаю только эти enter image description here

Я реализовал это:

func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
        let forword = UIMenuItem(title: "Demo", action: #selector(self.demo))
        UIMenuController.shared.menuItems?.append(forword)
        UIMenuController.shared.update()
        return true
    }

    func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
        UIMenuController.shared.setMenuVisible(true, animated: true)
    }

    func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.clearAllSelectedCell()
    }

Но мое требование состоит в том, чтобы сделать это:

enter image description here

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018
1.  create protocol to provide control into your view controller :

public protocol MenuItemDelegate {
    func copyAction(cell: UITableViewCell)
    func forwordAction(cell: UITableViewCell)
    func deleteAction(cell: UITableViewCell)
}

2.  create a custom table cell:

        class MyTableCell: UITableViewCell {

            var menuItemDelegate: MenuItemDelegate!

            var isCopyEnable = true
            var isForwardEnable = true
            var isDeleteEnable = true


            override func awakeFromNib() {
                super.awakeFromNib()
            }

            func setUpmenu(){
                let menu = UIMenuController.shared
                let forword = UIMenuItem(title: "Forward", action: #selector(self.forword(_:)))
                let delete = UIMenuItem(title: "Delete", action: #selector(self.deleteAction(_:)))
                menu.menuItems = [forword,delete]
                if !isDeleteEnable{
                    menu.menuItems?.remove(at: (menu.menuItems?.index(of: delete))!)
                }
                if !isForwardEnable{
                    menu.menuItems?.remove(at: (menu.menuItems?.index(of: forword))!)
                }
                menu.update()
            }

            override public func copy(_ sender: Any?) {
                UIPasteboard.general.string = accessibilityValue
                menuItemDelegate.copyAction(cell: self)
                UIMenuController.shared.setMenuVisible(false, animated: true)
            }

            @objc public func forword(_ sender: Any?) {
                menuItemDelegate.forwordAction(cell: self)
                UIMenuController.shared.setMenuVisible(false, animated: true)
            }

            @objc public func deleteAction(_ sender: Any?) {
                menuItemDelegate.deleteAction(cell: self)
                UIMenuController.shared.setMenuVisible(false, animated: true)
            }

            override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
                return (action == #selector(copy(_:))  || action == #selector(forword(_:)) || action == #selector(deleteAction(_:)))
            }
    }

3. Implement in view controller as like : 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableCell", for: indexPath) as! MyTableCell
    cell.isForwardEnable = false
    cell.setUpmenu()
    return cell
}

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

func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
    UIMenuController.shared.setMenuVisible(true, animated: true)
}

func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
    return true
}

Это поможет вам достичь этого.

0 голосов
/ 11 мая 2019

Выполните следующие шаги, чтобы получить пользовательские элементы при длительном нажатии.

  1. Вставьте приведенный ниже код в метод viewDidload let reply = UIMenuItem (title: "Reply", action: #селектор (MessageCollectionViewCell.reply (_ :))) let edit = UIMenuItem (title: "Edit", action: #selector (MessageCollectionViewCell.edit (_ :))) let forward = UIMenuItem (title: "Forward", action: #селектор (MessageCollectionViewCell.forward (_ :))) UIMenuController.shared.menuItems = [ответить, изменить, переслать] UIMenuController.shared.update ()

  2. расширение для пользовательского расширения ячейки MessageCollectionViewCell{

    @ objc func reply (_ sender: Any?) {// Получить collectionView, если let collectionView = self.superview as?UICollectionView {// Получить indexPath, если let indexPath = collectionView.indexPath (for: self) {// Триггерное действие collectionView.delegate? .CollectionView? (CollectionView, executeAction: #selector (MessageCollectionViewCell.reply (_ :)), forItemAt: indexPath, withSender: sender)}}}

    @ objc func edit (_ sender: Any?) {// Получить collectionView, если let collectionView = self.superview as?UICollectionView {// Получить indexPath, если let indexPath = collectionView.indexPath (for: self) {// Триггерное действие collectionView.delegate? .CollectionView? (CollectionView, executeAction: #selector (MessageCollectionViewCell.edit (_ :)), forItemAt: indexPath, withSender: sender)}}}

    @ objc func forward (_ sender: Any?) {// Получить collectionView, если let collectionView = self.superview as?UICollectionView {// Получить indexPath, если let indexPath = collectionView.indexPath (for: self) {// Триггерное действие collectionView.delegate? .CollectionView? (CollectionView, executeAction: #selector (MessageCollectionViewCell.forward (_ :)), forItemAt: indexPath, withSender: sender)}}}

}

Добавьте этот код в свой контроллер, в моем случае при этом (класс ChatViewController: MessagesViewController {})

// ---------------------------------------------------------------------------------------- // MARK: - обрабатывать длительное нажатие // ---------------------------------------------------------------------------------------- переопределить func collectionView (_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool {вернуть true}

переопределитьfunc collectionView (_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {print (action.description) let message = messages [indexPath.section] // let message = messagesDataSource.messageForItem (at: indexPath, in: messagesCollectionView)

if action == NSSelectorFromString("reply:") {
    return true
}
else if action == NSSelectorFromString("edit:") {
    return true

}
else if action == NSSelectorFromString("forward:") {
    return true
}
else {
    return super.collectionView(collectionView, canPerformAction: action, forItemAt: indexPath, withSender: sender)
}

}

переопределить func collectionView (_ collectionView: UICollectionView, executeAction action: Selector, forItemAt indexPath: IndexPath, witОтправитель hSender: Любой?) {

if action == NSSelectorFromString("reply:") {
    print("reply item here!!")
}
else if action == NSSelectorFromString("edit:") {
    print("edit item here!!")
}
else if action == NSSelectorFromString("forward:") {
    print("forward item here!!")
}
else {
    super.collectionView(collectionView, performAction: action, forItemAt: indexPath, withSender: sender)
}

}

0 голосов
/ 10 октября 2018

Есть несколько вещей, которые не так с вашим кодом…

  • Не используйте UIMenuController.shared.menuItems?.append, просто установите menuItems
  • Не делайте этого в shouldShowMenuForRowAtпросто сделайте это один раз за viewDidLoad
  • Вам не нужно setMenuVisible

И самое главное

  • Действие для вашего менюitem должен быть методом в вашем подклассе ячейки табличного представления.

Итак, в вашем случае…

В вашем контроллере табличного представления должны быть следующие методы…

override func viewDidLoad() {
    super.viewDidLoad()

    let forward = UIMenuItem(title: "Forward", action: #selector(MyCell.menuItemTapped(_ :)))
    let delete = UIMenuItem(title: "Delete", action: #selector(MyCell.menuItemTapped(_ :)))
    UIMenuController.shared.menuItems = [forward, delete]
    UIMenuController.shared.update()
}

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

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

override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
    return true
}

и ваша клетка должна иметь ...

class MyCell: UITableViewCell {
    @objc func menuItemTapped(_ sender: UIMenuController) {
    }
}
...