从 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

如何从 UIMenuController 中删除粘贴?

如何从 iOS 的 UIMenuController 中删除默认的 UIMenuItem?

从 UIMenuController 中删除自定义菜单项

如何在 UIMenuController 中删除 COPY UIMenuItem

关于在 Swift 中删除 WKWebView 中的 UIMenuController 默认 menuItems 的问题