在Swift中是否可以对UITextField使用不同的UIMenuController实例?

时间:2018-08-19 05:41:04

标签: swift uimenucontroller

根据link,我们应该使用一个单例UIMenuController实例,该实例被称为编辑菜单。
问题是我想在不同情况下显示其他项目。例如,我只想在键盘启动时显示“复制”项目。并在点击表格视图行时显示“复制”和“回复”。
当我在UIMenuController实例中添加“回复”时,也会在点击UITextField时显示它。因此,我添加了以下代码:

func textViewDidBeginEditing(_ textView: UITextView) {
var nonReplyMenuItems: [UIMenuItem] = []
        if let allMenuItems = UIMenuController.shared.menuItems {
            for menuItem in allMenuItems {
                if menuItem.title != "reply".localized {
                    nonReplyMenuItems.append(menuItem)
                }
            }
        }
        UIMenuController.shared.menuItems = nonReplyMenuItems
        UIMenuController.shared.setMenuVisible(true, animated: true)
}

它在大多数情况下解决了问题,但并非全部。 当键盘抬起并在表格视图中点击一行时,将添加“回复”。然后,当我点击UITextView时,回复也会显示在这里。

1 个答案:

答案 0 :(得分:1)

您的情况似乎是这样的:

在文本字段上点按---->显示复制

点击表格视图--->显示复制并回复

文本字段上的选项卡---->显示复制并回复(您只希望复制显示)

据我所知,textViewDidBeginEditing调用是在您的文本字段未编辑且点击时进行的;因此,如果您每次都通过打开该方法调用而拥有两个textfiled,但是当您在一个文本字段和另一个操作基础对象之间切换时,您的文本字段正在编辑并且其状态没有改变。

当您触摸表格视图时,您必须调用textfield.resignFirstResponder(),因此当您再次点击文本字段时,textViewDidBeginEditing再次调用时,问题在于隐藏了键盘。我更喜欢的一种更好的方法是添加功能,以触摸文本字段或手势来完成您在textViewDidBeginEditing方法上编写的内容