由于自己喜欢看段子,最近做了一个看段子的APP。主要是因为网易新闻和今日头条分享段子的姿势恕我不能忍。
完成后的效果
2017-02-21 16_00_55.gif
坑
在其中用到了UIMenuController
这个控件。真的是一个巨坑,上网搜了各种帖子,都不能解决我所遇到的问题。最终这篇帖子帮了我。
1
UIMenuItem(title: "QQ",action: #selector(mqq))
看到这个结构,你很自然先到mqq这个方法接收传递的对象是UIMenuItem
但是他传递的是UIMenuController
2
override func tableView(_ tableView: UITableView, didSelectRowAt indexPathIndexPath) {
tableView.deselectRow(at indexPath animated true)
if let cell =cellForRow
// self.becomeFirstResponder() 这里先注释
qqItem UIMenuItemtitle "QQ" action #selector(mqq)) wechatItem "wechat"#selector(wechat)) menuController UIMenuControllershared
menuControllermenuItems [qqItem wechatItem]
menuControllersetTargetRectcellframein cellsuperview!)setMenuVisible(
selectedText textLabel?.text
}
}
这段代码写在UITableViewController
中,在不切换tab的情况下,点击cell后UIMenuController
是能显示出来的,切换后就显示不出来了。必须加上注释的那句
3
longPresssenderUILongPressGestureRecognizer senderstate ==began selfbecomeFirstResponder() // 这句很重要shared
item1 "测试1"#selector(test1)) item2 "测试2"#selector(test2))item1 item2 superview
在上面的基础上,把这段代码放在自定义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
如果你这样
canPerformAction
Selector withSender senderAny?)->Boolreturntrue}
会显示出系统内置的和你定义的,如果你没有实现对应的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