Swift UIMenuController 中的坑

由于自己喜歡看段子,最近做了一個看段子的APP。主要是因為網(wǎng)易新聞今日頭條分享段子的姿勢恕我不能忍。

完成后的效果

2017-02-21 16_00_55.gif
  • 你只需要點擊你想要分享的段子
  • 然后選擇QQ或者Wechat,跳轉(zhuǎn)后點擊粘貼就好了
    不用像網(wǎng)易新聞今日頭條分享一個鏈接,別人想看還得點進去。當然他們也可以復(fù)制,但是那姿勢真的不優(yōu)雅。

在其中用到了UIMenuController這個控件。真的是一個巨坑,上網(wǎng)搜了各種帖子,都不能解決我所遇到的問題。最終這篇帖子幫了我。

1

UIMenuItem(title: "QQ", action: #selector(mqq))看到這個結(jié)構(gòu),你很自然先到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)
        }
    }

在上面的基礎(chǔ)上,把這段代碼放在自定義cell中,UIMenuController又顯示不出來了
必須加上

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

從方法名你可以看出就是可以執(zhí)行的方法,會顯示出對應(yīng)的UIMenuItem

如果你這樣

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

會顯示出系統(tǒng)內(nèi)置的和你定義的,如果你沒有實現(xiàn)對應(yīng)的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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容