Swift UIMenuController 中的坑

作者: xiAo__Ju | 来源:发表于2017-02-22 14:34 被阅读457次

    由于自己喜欢看段子,最近做了一个看段子的APP。主要是因为网易新闻今日头条分享段子的姿势恕我不能忍。

    完成后的效果

    2017-02-21 16_00_55.gif
    • 你只需要点击你想要分享的段子
    • 然后选择QQ或者Wechat,跳转后点击粘贴就好了
      不用像网易新闻今日头条分享一个链接,别人想看还得点进去。当然他们也可以复制,但是那姿势真的不优雅。

    在其中用到了UIMenuController这个控件。真的是一个巨坑,上网搜了各种帖子,都不能解决我所遇到的问题。最终这篇帖子帮了我。

    1

    UIMenuItem(title: "QQ", action: #selector(mqq))看到这个结构,你很自然先到mqq这个方法接收传递的对象是UIMenuItem
    但是他传递的是UIMenuController

    2

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            tableView.deselectRow(at: indexPath, animated: true)
            if let cell = tableView.cellForRow(at: indexPath) {
    //            self.becomeFirstResponder()  这里先注释
                let qqItem = UIMenuItem(title: "QQ", action: #selector(mqq))
                let wechatItem = UIMenuItem(title: "wechat", action: #selector(wechat))
                let menuController = UIMenuController.shared
                menuController.menuItems = [qqItem, wechatItem]
                menuController.setTargetRect(cell.frame, in: cell.superview!)
                menuController.setMenuVisible(true, animated: true)
                selectedText = cell.textLabel?.text
            }
        }
    

    这段代码写在UITableViewController中,在不切换tab的情况下,点击cell后UIMenuController是能显示出来的,切换后就显示不出来了。必须加上注释的那句

    3

    func longPress(sender: UILongPressGestureRecognizer) {
            if sender.state == .began {
                self.becomeFirstResponder() // 这句很重要
                let menuController = UIMenuController.shared
                let item1 = UIMenuItem(title: "测试1", action: #selector(test1))
                let item2 = UIMenuItem(title: "测试2", action: #selector(test2))
                menuController.menuItems = [item1, item2]
                menuController.setTargetRect(frame, in: superview!)
                menuController.setMenuVisible(true, animated: true)
            }
        }
    

    在上面的基础上,把这段代码放在自定义cell中,UIMenuController又显示不出来了
    必须加上

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
            if [#selector(test1), #selector(test2)].contains(action) {
                return true
            }
            return false
        }
    

    从方法名你可以看出就是可以执行的方法,会显示出对应的UIMenuItem

    如果你这样

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

    会显示出系统内置的和你定义的,如果你没有实现对应的Selector,会Crash

    Screen Shot 2017-02-22 at 下午2.26.14.png Screen Shot 2017-02-22 at 下午2.26.27.png Screen Shot 2017-02-22 at 下午2.26.39.png Screen Shot 2017-02-22 at 下午2.31.37.png

    本文Demo

    相关文章

      网友评论

      • 灯红酒绿映不出的落寞:请问一下,系统自带的复制,copy之类的可以去掉吗?或者说,自定义的item放到显示的最前边,系统自带的放到后边?
        xiAo__Ju:@灯红酒绿映不出的落寞 你可以去看我段子分享神器那边文章里的demo有用到
        灯红酒绿映不出的落寞:@xiAo__Ju 大佬先让我膜拜一下,然后能说下具体的吗
        xiAo__Ju:@灯红酒绿映不出的落寞 可以自定义的

      本文标题:Swift UIMenuController 中的坑

      本文链接:https://www.haomeiwen.com/subject/fmqmwttx.html