iOS UIMenuController UIMenuItem
在本教程中,我们将在iOS应用程序中实现UIMenuController元素。
UIMenuController
UIMenuController类用于在UI元素上显示编辑菜单。
编辑菜单是一个具有不同操作的矩形框。
默认情况下,有一些内置操作,例如剪切,复制,粘贴,查找,替换,定义等。
通常,这也称为iOS工具提示菜单,因为它具有用于快速操作的便捷命令。
UIMenuItems添加到此UIMenuController中。
通过示例更容易理解这种工作方式。
让我们从一个很小的基础项目开始。
代码
如下图所示,在XCode的Main.storyboard中添加一个UITextField:
以下是ViewController.swift的代码:
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var myTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
myTextField.delegate = self
let menuController: UIMenuController = UIMenuController.shared
menuController.setMenuVisible(true, animated: true)
menuController.arrowDirection = UIMenuController.ArrowDirection.default
menuController.setTargetRect(CGRect.zero, in: view)
let menuItem1: UIMenuItem = UIMenuItem(title: "Menu 1", action: #selector(onMenu1(sender:)))
let menuItem2: UIMenuItem = UIMenuItem(title: "Menu 2", action: #selector(onMenu2(sender:)))
let menuItem3: UIMenuItem = UIMenuItem(title: "Menu 3", action: #selector(onMenu3(sender:)))
//Store MenuItem in array.
let myMenuItems: [UIMenuItem] = [menuItem1, menuItem2, menuItem3]
//Added MenuItem to MenuController.
menuController.menuItems = myMenuItems
}
override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool {
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@objc internal func onMenu1(sender: UIMenuItem) {
print("onMenu1")
}
@objc internal func onMenu2(sender: UIMenuItem) {
print("onMenu2")
}
@objc internal func onMenu3(sender: UIMenuItem) {
print("onMenu3")
}
}
让我们分析一下以上代码中发生的事情。
UIMenuController是一个单例实例。
因此使用" shared"初始化。将属性arrowDirection设置为默认值。
默认方向是上还是下,具体取决于屏幕上的位置。setTargetRect用于设置MenuController的位置。
在上面的代码中,我们将CGRect设置为零,这意味着它将在UI元素的上方/下方显示MenuController。
但是MenuController如何知道其中显示以及向谁显示?
答:UIResponder。
UIResponder负责保持响应者链层次结构。
类似于视图层次结构。
作为第一响应者的对象将获取所有新事件。
通常,UITextField是第一响应者。
要将另一个UI元素设置为第一响应者,我们可以调用becomeFirstResponder。
要创建UIMenuItem的实例,我们可以将其定义为:
UIMenuItem(title:,action:)-标题是字符串,而action是选择器函数,当单击该UIMenuItem时会触发该选择器函数。
然后我们通过在menuController.menuItems上设置MenuItem的数组。
canPerformAction(_:withSender :)是UIResponder的一部分。
返回true表示将显示所有操作。
让我们看看所有动作是什么。
让我们在模拟器上运行上述iOS应用程序,然后查看输出。
哇!它显示了很多动作。
为什么这样?
默认情况下,我们在canPerformAction中返回true。
这将返回所有动作。
为了只显示我们想要的动作,我们可以将canPerformAction函数更改为:
override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool {
if [#selector(onMenu1(sender:)), #selector(onMenu2(sender:)), #selector(onMenu3(sender:))].contains(action) {
return true
}
else{
return false
}
}
这样,我们可以检查动作是否属于以上选择器之一。
否则,我们返回false。
要包含任何默认操作,我们只需包含其内置选择器即可。
一些内置的选择器如下所示:
- #selector(cut(_:))
- #selector(copy(_:))
- #selector(paste(_:))
以上方法的内置实现在UIResponderStandardEditActions协议中可用。
我们也可以覆盖它们。

