Another UIMenuController won't display problem
,并先感谢您的帮助。我向您保证,我已经在这里阅读了有关UIMenuController问题的大部分内容。我真的认为我已经涵盖了所有内容。显然,我错过了一些事情。
简而言之,我正在尝试复制"替换... "编辑菜单行为(但其功能与替换不同)。 (如果您不熟悉,则选择一个单词后,编辑菜单中的"替换..."选项将弹出第二个菜单,其中显示了该单词的可能替代拼写。)
在UITextView(子类化)中,我选择了一些文本。默认手势识别器使编辑菜单显示预期的项目,包括我添加的" Translate ... "选项。当我在菜单中单击"翻译... "时,菜单关闭并调用我的选择器代码。该代码将菜单项更改为我想要的子选择。我打电话
我看到对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 ... "一直都在执行。
我已验证的内容:
还有什么?谢谢!!
我向苹果寻求帮助。解决方法是添加
1 | sharedMC.hideMenu() |
就在调用
我认为问题是我的代码不是最初显示菜单的内容,因此我不得不隐藏它,然后我的代码才能显示它。我从通知中注意到,菜单根本没有被正式"隐藏"(即使在按下"翻译..."按钮后不再可见)。
我也尝试过只是更改menuItems并调用