Swift UIMenuController中的坑

由于自己喜欢看段子,最近做了一个看段子的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 又显示不出来了

必须加上这两个方法

// MARK: - 必须实现的两个方法

    override var canBecomeFirstResponder: Bool {

        return true

    }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值