目标:如标题,例如微信聊天界面,长按一条消息,可以弹出复制 删除pop。如图
问题点:在网上查阅很多资料都是objc的多,swift的资料少。
还有由于swift4的更新,很多资料中说的内容没办法匹配。
步骤:
1.创建UITableview,可以显示列表。不赘述
2.实现长按操作:主要是在列表中增加如下代码,具体细节不赘述
let longpress :UILongPressGestureRecognizer=UILongPressGestureRecognizer(target:self, action:#selector(long(_:)))
tableCell.addGestureRecognizer(longpress)
3.重点,必须有,该值默认是false,不重写的话pop不会弹出:
在UITableViewCell的子类中 重写 override var canBecomeFirstResponder:Bool{
return true
}
4.在长按动作执行函数中,执行如下:
recognizer.view?.becomeFirstResponder()
let menu = UIMenuController.shared
letdeleteItem =UIMenuItem(title:"Delete", action:#selector((deleteLine)))
leteditItems =UIMenuItem(title:"Edit", action:#selector((editRow)))
menu.menuItems= [deleteItem ,editItems]
menu.setTargetRect(CGRect(x:30, y:8, width:100, height:50), in: recognizer.view!)
menu.setMenuVisible(true, animated:true)
5.重点!必须有
在UITableViewController的子类中重写canPerformAction函数,该函数有bool型返回值,如果直接返回true,所有UIMenuController中系统自带的 复制粘贴 转换什么的按钮全部显示,自己自定义的将在最后面显示。
如果直接返回false,则pop不显示。所以这里需要根据自己的需要判断,需要显示什么按钮,什么情况返回ture。判断条件是 pop按钮对应的selector
override func canPerformAction(_action:Selector, withSender sender:Any?) ->Bool{
if(action ==#selector(TableViewController.deleteLine) || action ==#selector(TableViewController.editRow))
{
return true;
}
else
{
return false;
}
}