Xcode Swift-设置可见菜单控制器

Xcode Swift-设置可见菜单控制器,xcode,swift,Xcode,Swift,我试图显示UimenuController,但无法查看它。我该怎么办 let MenuController: UIMenuController = UIMenuController.sharedMenuController() MenuController.menuVisible = true MenuController.arrowDirection = UIMenuControllerArrowDirection.Down MenuController.setTargetRect(CG

我试图显示UimenuController,但无法查看它。我该怎么办

let MenuController: UIMenuController = UIMenuController.sharedMenuController()
 MenuController.menuVisible = true
 MenuController.arrowDirection = UIMenuControllerArrowDirection.Down
 MenuController.setTargetRect(CGRectMake(100, 80, 50, 50), inView: self.view)
 let MenuItem_1: UIMenuItem = UIMenuItem(title: "Menu", action: "delete:")
 let MenuItems: NSArray = [delete]
 MenuController.menuItems = MenuItems

要真正显示菜单,您需要执行以下操作:

  • 在获取sharedMenuController之前调用becomeFirstResponder()
  • 调用菜单。最后设置菜单可见(true,动画:true)
  • 覆盖canBecomeFirstResponder函数
  • 覆盖canPerformAction功能
  • 编写选择器的函数
  • 这里有一个例子

    func someFunc() {
        becomeFirstResponder()
        var menu = UIMenuController.sharedMenuController()
        var deleteItem = UIMenuItem(title: "Delete me", action: Selector("deleteLine"))
        menu.menuItems = [deleteItem]
        menu.setTargetRect(CGRectMake(100, 80, 50, 50), inView: self)
        menu.setMenuVisible(true, animated: true)
    }
    
    func deleteLine() {
        //Do something here
    }
    
    override func canBecomeFirstResponder() -> Bool {
        return true
    }
    
    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        // You need to only return true for the actions you want, otherwise you get the whole range of
        //  iOS actions. You can see this by just removing the if statement here.
        if action == Selector("deleteLine") {
            return true
        }
        return false
    }
    
    Swift 3版本代码:

    func someFunc() {
        becomeFirstResponder()
        var menu = UIMenuController.shared
        var deleteItem = UIMenuItem(title: "Delete me", action: #selector(ViewController.deleteLine))
        menu.menuItems = [deleteItem]
        menu.setTargetRect(CGRect(x: 0.0, y: 0.0, width: 20, height: 20), in: self)
        menu.setMenuVisible(true, animated: true)
    }
    
    func deleteLine() {
        //Do something here
    }
    
    override var canBecomeFirstResponder: Bool {
    
            return true
        }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
            // You need to only return true for the actions you want, otherwise you get the whole range of
            //  iOS actions. You can see this by just removing the if statement here.
            if action == #selector(ViewController.deleteLine) {
                return true
            }
    
            return false
        }
    

    更重要的一点是应该实现UIMenuItem的操作

    你需要调用方法setMenuVisible:(BOOL)menuVisible animated:(BOOL)uiMenuController上的animated我不知道,请举一个例子非常感谢,如果我想在longpress点上方显示菜单,首先设置一个长按处理程序,然后你可以从longpress函数调用someFunc。长按功能有两种状态,您将关注UIGestureRecognitizerState.Begind和UIGestureRecognitizerState.End请接受这一正确答案。它工作得很好。谢谢:)@MassimoNegro您应该将此设置为已接受的答案。您不必打电话成为第一响应者someFunc@BhadreshKathiriya请尝试将“in:self”替换为您想要的对象。菜单将弹出“in:ui视图”