由于在应用程序的其他地方使用 UIMenuController,UISearchBar 显示错误的 UIMenuItems

Posted

技术标签:

【中文标题】由于在应用程序的其他地方使用 UIMenuController,UISearchBar 显示错误的 UIMenuItems【英文标题】:UISearchBar shows wrong UIMenuItems due to use of UIMenuController elsewhere in app 【发布时间】:2014-05-22 15:43:01 【问题描述】:

我有MyRootViewController,它在按下按钮时以模态方式呈现MyModalViewControllerMyModalViewController 包含一个 UISearchBar,我希望它在其文本字段中长按时显示通常的 [剪切|复制|粘贴|全选] 文本选项。

MyRootViewController 在长按时呈现自定义UIMenuItems(通过UIMenuController),因此覆盖- (BOOL)canBecomeFirstResponder- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 并实现-(void)duplicate:(id)sender-(void)delete:(id)sender

我遇到的问题是MyRootViewController 被询问在MyModalViewController 内显示哪个UIMenuItems,当用户在其中长按并因此显示不相关的菜单项,而不是通常的文本字段的[剪切|复制|粘贴|全选]选项。

我的理解是,这是因为MyRootViewController 仍在响应者链中,即使它当前不可见。

到目前为止,我想出的最佳解决方案是继承 UISearchBar 并覆盖 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender,返回 YES 进行剪切、复制、粘贴或全选。这阻止了 ios 进一步寻找响应者链。但这感觉像是一种 hack - 我不应该仅仅因为我在其他地方使用 UIMenuController 而使 UISearchBar 与系统的其余部分的行为一致而诉诸于此。

有谁知道这个问题在技术上更正确的解决方案?

【问题讨论】:

【参考方案1】:

您可以选择仅在长按时设置[UIMenuController sharedController]menuItems 属性。并在抛出 UIMenuControllerWillHideNotification 时将其设置为 nil。

【讨论】:

以上是关于由于在应用程序的其他地方使用 UIMenuController,UISearchBar 显示错误的 UIMenuItems的主要内容,如果未能解决你的问题,请参考以下文章

识别最大值行然后在其他地方使用时出现索引越界错误

QT程序在发布的时候应注意的地方

使用它来存储 JSX 组件以在其他地方显示是不是是滥用上下文?

java虚拟机规范阅读异常

由于用户权限,将文件存储在缓存中而不是硬盘驱动器中

程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效