关于swift:另一个UIMenuController不会显示问题

Another UIMenuController won't display problem

,并先感谢您的帮助。我向您保证,我已经在这里阅读了有关UIMenuController问题的大部分内容。我真的认为我已经涵盖了所有内容。显然,我错过了一些事情。

简而言之,我正在尝试复制"替换... "编辑菜单行为(但其功能与替换不同)。 (如果您不熟悉,则选择一个单词后,编辑菜单中的"替换..."选项将弹出第二个菜单,其中显示了该单词的可能替代拼写。)

在UITextView(子类化)中,我选择了一些文本。默认手势识别器使编辑菜单显示预期的项目,包括我添加的" Translate ... "选项。当我在菜单中单击"翻译... "时,菜单关闭并调用我的选择器代码。该代码将菜单项更改为我想要的子选择。我打电话
UIMenuController.shared.showMenu(from: self, rect: textBounds)
我看到对canPerformAction()的调用以验证是否可以识别出我添加的"子菜单"项,但是菜单从不显示。此子菜单不会发生willShowWindowNotification的通知(在打开第一个菜单时发生)。

这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@objc func translateSelectionMenu()
{
    let sharedMC = UIMenuController.shared
    // Create menu choices for the translate sub-menu.
    let charChoice = UIMenuItem(title:"To Chars", action: #selector(translateChars))
    let byteChoice = UIMenuItem(title:"Byte Decimal", action: #selector(translateByte))
    let halfChoice = UIMenuItem(title:"2-Byte Decimal", action: #selector(translateHalf))
    savedMenuItems = sharedMC.menuItems
    sharedMC.menuItems = [charChoice, byteChoice, halfChoice]

... for brevity, I've omitted the code here which determines the bounds of the user's
    text selection. The resulting numbers are shown below.

    let textBounds = CGRect(x: 114.1, y: 73, width: 48, height: 55)
    // let windowBounds = convert(textBounds, to: nil)
    // sharedMC.update() not needed
    self.becomeFirstResponder()  // TextView is already the first responder. This does nothing.
    sharedMC.showMenu(from: self, rect: textBounds)
}

请注意,TextView IS和必须保持第一响应者。 (更改它会失去用户的选择。)因此,我已经在显示用户文本的UITextView的子类中实现了所有这些功能。我尝试使用UITextView引用的边界和窗口引用的边界,但均不起作用。

如果我移动所选文本的端点之一或仅单击所选内容,这将导致菜单再次显示,并且菜单中包含了我的子菜单项。我知道这应该可行,因为" Replace ... "一直都在执行。

我已验证的内容:

  • 我的UITextView子类是UIView。
  • UserInteractionIsEnabled为true(因为我可以选择文本)。
  • 只有一个窗口,但是我在调??用canBecomeFirstResonder的时候正在调用self.window.makeKeyAndVisible()。
  • 我已经实现了canBecomeFirstResponder()(返回True)。 (在手势识别器调出第一个菜单之前被调用,但在此之后不被调用。)
  • 我确实调用了self.becomeFirstResponder()(即使它已经是)。
  • 我已经实现了canPerformAction()。第一菜单项和子菜单项都被称为很多。对于要使用的项目,我返回True。
  • 还有什么?谢谢!!


    我向苹果寻求帮助。解决方法是添加

    1
    sharedMC.hideMenu()

    就在调用showMenu()之前。

    我认为问题是我的代码不是最初显示菜单的内容,因此我不得不隐藏它,然后我的代码才能显示它。我从通知中注意到,菜单根本没有被正式"隐藏"(即使在按下"翻译..."按钮后不再可见)。

    我也尝试过只是更改menuItems并调用update(),但这也没有用,可能是出于相同的原因。