实现长按UITableView列表,弹出UIMenuController的剪切复制pop

目标:如标题,例如微信聊天界面,长按一条消息,可以弹出复制 删除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;

        }

    }

你可能感兴趣的:(实现长按UITableView列表,弹出UIMenuController的剪切复制pop)