2014-10-09 89 views
3

我试图显示一个UimenuController,但我无法查看它。我能怎么做?Swift-设置可见菜单控制器

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 
+1

需要调用方法setMenuVisible:(BOOL)menuVisible 动画: (布尔)动画UIMenuController – Sandeep 2014-10-09 08:05:36

+0

我不知道,请举一个例子 – 2014-10-09 20:17:51

回答

14

为了居然要显示你需要做以下菜单:

  1. 呼叫becomeFirstResponder()你得到你sharedMenuController前
  2. 呼叫menu.setMenuVisible(真,动画: true)
  3. 重写canBecomeFirstResponder函数
  4. 重写canPerformAction函数
  5. 编写函数用于选择器

下面是一个例子

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 
} 
+0

非常感谢你非常非常,如果我想显示上面的longpress点菜单? – 2014-10-10 21:25:55

+0

首先设置一个长按处理程序,然后可以从longPress函数调用someFunc。长按功能有两个状态,你会关心UIGestureRecognizerState.Began和UIGestureRecognizerState.End – 2014-10-13 16:52:22

+0

谢谢你[关闭] – 2014-10-16 19:37:01

3

夫特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 
    } 
+0

@BhadreshKathiriya中调用becomeFirstResponder请尝试将“in:self”替换为你想要菜单的对象,就会弹出如“in:UIView” – mriaz0011 2017-07-07 11:31:56