You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:51:01