Swift UIMenuController 中的坑
2017-02-22 本文已影响457人
xiAo__Ju
由于自己喜欢看段子,最近做了一个看段子的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
本文Demo