iOS 15中UIResponderStandardEditActions新增pasteAndGo(_:)方法的使用异常求助
解决iOS15中pasteAndGo:未识别选择器的问题
嘿,我刚好研究过iOS15这几个新增的粘贴相关API,你踩的坑其实是对这些方法的本质理解有偏差,咱们一步步理清楚:
首先纠正一个关键误解
你以为pasteAndGo(_:)是系统给UITextField预设的别名方法?其实不是!这些新增的pasteAndMatchStyle:、pasteAndGo:、pasteAndSearch:是UIResponderStandardEditActions协议新增的可选方法,系统的UITextField、UITextView这些文本控件并没有默认实现它们。系统提供这些方法的核心目的是:当用户主动触发这些操作时,系统会明确这是用户的意图,不会弹出那个烦人的剪贴板访问提示横幅——而粘贴的具体逻辑,完全需要我们自己来实现。
为什么会抛出"unrecognized selector"异常?
你在代码里调用textField.pasteAndGo(sender),但UITextField根本没实现这个方法,自然会触发这个错误。系统只是定义了这些方法的协议接口,并没有给文本控件做默认实现。
正确的实现方式
我们需要自己在响应者(比如你的ViewController,或者自定义的文本控件子类)里实现pasteAndGo(_:)方法,手动完成「粘贴内容+执行对应动作」的逻辑。这里给你修正后的代码示例:
class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() let item = UIMenuItem(title: "Paste & Go", action: #selector(pasteAndGo(_:))) UIMenuController.shared.menuItems = [item] } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if action == #selector(pasteAndGo(_:)) { // 优化:只有剪贴板有文本内容时,才显示这个菜单项 return UIPasteboard.general.hasStrings } return super.canPerformAction(action, withSender: sender) } override func pasteAndGo(_ sender: Any?) { // 1. 先获取剪贴板的文本内容 guard let pastedText = UIPasteboard.general.string else { return } // 2. 将内容粘贴到文本框 textField.text = pastedText // 3. 执行"Go"对应的业务逻辑,比如打开URL if let targetURL = URL(string: pastedText), UIApplication.shared.canOpenURL(targetURL) { UIApplication.shared.open(targetURL) } // 如果是搜索场景,这里可以换成发起搜索请求、跳转到搜索页面等逻辑 } }
额外提示
这些新API的核心价值就是规避剪贴板访问提示,只要是用户主动触发这些方法(比如点击你添加的自定义菜单项),系统就不会弹出那个提示横幅。而粘贴的动作、后续的业务逻辑,都需要我们根据自己的需求来编写。
内容的提问来源于stack exchange,提问作者Stefan Arentz
相关产品推荐
相关产品推荐

