UIMenuController 未在 UICollectionViewController 子类上显示自定义操作

Posted

技术标签:

【中文标题】UIMenuController 未在 UICollectionViewController 子类上显示自定义操作【英文标题】:UIMenuController not showing custom action on UICollectionViewController subclass 【发布时间】:2017-06-14 22:39:42 【问题描述】:

我正在尝试在 UICollectionViewController 子类上使用 UIMenuController 显示自定义操作,即使剪切、复制和粘贴操作按预期显示,但由于某种原因我的自定义操作没有。

我参考了很多网络上的参考资料,但没有一个能成功,这里是代码:

class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout 

    fileprivate var items = [MyClass]()

    // MARK: - UICollectionViewDataSource
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return items.count
    

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath)
        /* update cell properties */
        return cell
    

    // MARK: - UICollectionViewDelegate
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: itemSize, height: itemSize)
    

    override func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool 
        return true
    

    override func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) 
        /* Do Something */
    

    override func collectionView(_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool 
        return true
    

    public func menuAction(_ sender: UIMenuItem) 
        /* Action method*/
    

尝试添加菜单项如下:

        let menuItem = UIMenuItem(title: SFLocalization.localizedString("Common-remove"), action: #selector(CollectionViewController.menuAction(_:)))
        let menuController = UIMenuController.shared
//        menuController.menuItems?.append(menuItem)
        menuController.menuItems = [menuItem]

viewDidLoadcollectionView(_ collectionView:, shouldShowMenuForItemAt) -> Bool

有什么想法吗?

【问题讨论】:

遇到类似问题;你有没有运气找到解决方案? 【参考方案1】:

Omer - 查看此链接:http://dev.glide.me/2013/05/custom-item-in-uimenucontroller-of.html

基本上,移动这些方法:

(BOOL)canPerformAction:(SEL)action withSender:(id)sender

(BOOL)canBecomeFirstResponder

... 到 CollectionView 单元子类的作品。然后,您必须将此选择器传递回单元委托。

有了这个,我可以让我的自定义菜单出现!

【讨论】:

以上是关于UIMenuController 未在 UICollectionViewController 子类上显示自定义操作的主要内容,如果未能解决你的问题,请参考以下文章

在 UIMenuController 出现之前更改用于 UIMenuController 的标签标题

何时使用 UIMenuController

UIMenuController 没有出现

UIMenuController

UIMenuController

使用 uimenucontroller 时遇到问题