gpt4 book ai didi

ios - 为什么在调用 menuItem 的操作时会再次调用 canPerformAction?

转载 作者:行者123 更新时间:2023-11-28 07:48:50 25 4
gpt4 key购买 nike

下面是我的代码,我发现当单击菜单“pasteAndGo”时,会打印两个日志字符串:1.粘贴并显示 2.粘贴并单击。我的要求是显示菜单时,显示“粘贴并显示”日志。单击它时,将显示“粘贴并单击”日志。

class MyTextField: UITextField {

private func Init() {
let menuController: UIMenuController = UIMenuController.shared
menuController.isMenuVisible = true
let pasteAndGoMenuItem: UIMenuItem = UIMenuItem(title: "pasteAndGo", action: #selector(pasteAndGo(sender:)))

let myMenuItems: NSArray = [pasteAndGoMenuItem]
menuController.menuItems = myMenuItems as? [UIMenuItem]
}

@objc private func pasteAndGo(sender: UIMenuItem) {
Print("paste and go clicked")
}

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
let pasteboard = UIPasteboard.general

if action == #selector(pasteAndGo) {
if pasteboard.url != nil {
Print("paste and go show")
return true
} else {
return false
}
}

return super.canPerformAction(action, withSender: sender)
}
}

最佳答案

您的代码按实现方式工作:

  • 在您按下pasteAndGo 菜单项的瞬间,UIKit 框架调用canPerformAction 询问是否允许执行该操作。在这里,您打印“粘贴并显示”
  • 由于您返回 true,您的操作 pasteAndGo(sender:) 被执行并打印“paste and go clicked”

要对显示的菜单项使用react,您必须使用 UIMenuController.willShowMenuNotification 注册到通知中心,如下所示:

// create a property 
var token: NSObjectProtocol?

// then add observer
self.token = NotificationCenter.default.addObserver(forName: UIMenuController.willShowMenuNotification, object: nil, queue: .main)
{ _ in
print ("paste and go show")
}

一旦您的 View Controller 被关闭,不要忘记取消订阅(NotificationCenter.default.removeObserver)。

if let t = self.token {
NotificationCenter.default.removeObserver(t)
}

更新

您也可以在 Init

中这样做(没有属性)
// in Init
var token = NotificationCenter.default.addObserver(forName: UIMenuController.willShowMenuNotification, object: nil, queue: .main)
{ _ in
print ("paste and go show")
NotificationCenter.default.removeObserver(token)
}

关于ios - 为什么在调用 menuItem 的操作时会再次调用 canPerformAction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50225402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com