从 UIMenuController 中删除复制、查找和共享
Posted
技术标签:
【中文标题】从 UIMenuController 中删除复制、查找和共享【英文标题】:Removing Copy, Look Up, and Share from UIMenuController 【发布时间】:2016-10-05 23:44:13 【问题描述】:我正在尝试覆盖默认的UIMenuController
,这样当用户在其文本视图中选择文本时,只会出现我的自定义项“定义...”。到目前为止,我在网上找到的方法都不太走运。
更具体地说,我将UIViewController
子类化并使用canPerformAction()
排除除我的define 方法之外的所有操作。
override func becomeFirstResponder() -> Bool
return true
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
let canPerform: Bool
if action == #selector(defineWord)
canPerform = true
else
canPerform = false
print("action = \(action), canPerform = \(canPerform)")
return canPerform
在视图控制器的viewDidLoad()
中,我包含了以下内容:
let shared = UIMenuController.shared
let menuItemDefine = UIMenuItem(title: "Define...", action: #selector(self.defineWord))
shared.menuItems = [menuItemDefine]
每当我在视图中选择文本时,控制台都会检查UIMenuController
中可能出现的每个可能的操作,并表示它们无法执行,但我的自定义操作除外:
action = cut:, canPerform = false
action = select:, canPerform = false
(and so on, until...)
action = defineWord, canPerform = true
但生成的编辑菜单包含“复制”、“查找”、“共享”和“定义...”。这些没有出现在控制台中,这让我觉得需要一种不同的方法。
请注意,我也尝试过对UITextView
进行子类化并酌情使用上述代码,但结果是一样的。
任何想法我哪里出错了?
【问题讨论】:
你有解决办法吗? 【参考方案1】:这可能会帮助每个提出这个问题的人,即如何删除“复制”、“全选”等。标准菜单项或UIResponderStandardEditActions
,当您已经在canPerformAction:
中返回false
时仍然可见.
与响应者链有关。由于每个响应者都会调用 canPerformAction:
,因此对于其中一些响应者,它可能会在 canPerformAction:
中返回 true 作为默认值。
因此,为了检查失败的地方,我通过为我在控制器中使用的每个元素覆盖 canPerformAction:
来找到它
例如,在我的视图控制器中,我有一个 webview
,而我犯的错误是我在委托方法中覆盖了 canPerformAction:
,即我正在做类似下面的事情
extension viewcontroller: UIWebViewDelegate
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
但关键是你必须为元素而不是作为委托方法。
extension UIView
func dropRoundCorners()
self.layer.cornerRadius = 10.0;
self.clipsToBounds = true;
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UIImageView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UIScrollView
open override func canPerformAction(_ action: Selector, withSender
sender: Any?) -> Bool
return false
extension UISlider
open override func canPerformAction(_ action: Selector, withSender
sender: Any?) -> Bool
return false
extension UIWebView
open override func canPerformAction(_ action: Selector, withSender
sender: Any?) -> Bool
return false
我希望这对遇到此问题的人有用。
以下链接可能对您有所帮助:
UIResponder reference
very important read the discussion here regarding responder
some what related
【讨论】:
这应该是公认的答案。 SO上的大多数答案都建议子类化 UITextView ,真正的解决方案是扩展它并在那里覆盖 canPerformAction 。在我的情况下,没有必要在 imageView、scrollView 等中覆盖它。这是我的答案***.com/questions/51014624/…。如果有更好的方式来感谢您,请告诉我。 这还能用吗?我无法在 Xcode 12 中得到相同的结果。 这仍然相关吗?使用 WKWebView 时似乎对我不起作用【参考方案2】:答案可能为时已晚,但对其他用户可能会有所帮助。 所以,我的解决方案是:我创建了自定义 UITextView 并重新定义了以下方法:
- (BOOL)canBecomeFirstResponder
return YES;
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
//Here you can check for all action what you need
return (action == @selector(yourCustomAction)) ? YES : NO;
【讨论】:
您是否也可以删除“复制”、“查找”、“共享”?它对我不起作用 没找到解决办法,但那主要是因为我停止尝试使用 Swift 并切换到 React Native...以上是关于从 UIMenuController 中删除复制、查找和共享的主要内容,如果未能解决你的问题,请参考以下文章
您如何真正从 UIMenuController 中删除 Copy
如何从 iOS 的 UIMenuController 中删除默认的 UIMenuItem?
如何在 UIMenuController 中删除 COPY UIMenuItem
关于在 Swift 中删除 WKWebView 中的 UIMenuController 默认 menuItems 的问题