UITextView的shouldInteractWith代理如何在alert弹窗确认后返回值
解决方案
你遇到的问题本质是UITextView的该交互代理是同步返回布尔值的,而弹窗的用户选择是异步回调,两者逻辑时序不匹配,不可能阻塞代理方法等待用户操作后再返回,换个实现思路即可:
- 第一步:在代理方法末尾直接返回
false,告知系统不要自动处理链接跳转,所有跳转逻辑由你自己控制 - 第二步:在弹窗的「确认」按钮回调中,手动调用系统API打开对应URL,「取消」按钮回调中不做任何操作即可
修改后的代码如下:
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { let alert = UIAlertController(title: "是否确认跳转?", message: "你即将离开当前应用打开外部链接", preferredStyle: .alert) let yesAction = UIAlertAction(title: "确认", style: .default) { _ in // 手动触发跳转逻辑 UIApplication.shared.open(URL) } let cancelAction = UIAlertAction(title: "取消", style: .cancel) alert.addAction(cancelAction) alert.addAction(yesAction) UIApplication.shared.firstKeyWindow?.rootViewController?.present(alert, animated: true) // 直接返回false,禁止系统自动处理跳转 return false }
- 补充说明:不需要在按钮的回调里手动调用
dismiss方法,UIAlertAction被点击后系统会自动关闭弹窗,额外写dismiss属于冗余代码;如果需要适配iOS 13以下的系统,open方法可以替换为对应的openURL旧API。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

