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

iOS点击TableView单元格向WebView传值延迟问题求助

解决TableView点击传值到WebView的延迟问题

嘿,我一眼就揪出问题的核心了——你用错了TableView的点击回调方法!

问题根源

你当前用的是tableView(_:didDeselectRowAt:),这个方法的触发时机是单元格从选中状态被取消时,而不是点击选中的瞬间。这就直接导致了延迟现象:

  • 第一次点击单元格:单元格被选中,这个方法根本不会执行,taskVar完全没被赋值,WebView加载的是默认的"undefined"
  • 第二次点击另一个单元格:之前的单元格取消选中,这个方法才触发,把第一次点击的单元格对应的值传给WebView,就出现了"点第二次才加载第一次值"的错位情况

解决方案

1. 替换成正确的点击回调方法

把didDeselectRowAt改成didSelectRowAt,这样点击单元格的瞬间就会触发传值逻辑,从根源解决延迟:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    // 先安全获取用户ID,避免强制解包崩溃
    guard let userID = UserDefaults.standard.string(forKey: "userID") else {
        print("用户ID未存储,无法加载任务页面")
        return
    }
    let storyboard = UIStoryboard(name: "App", bundle: nil) 
    // 安全实例化WebView控制器
    guard let popup = storyboard.instantiateViewController(withIdentifier: "taskWebVieww") as? taskWebView else {
        print("无法实例化taskWebView控制器")
        return
    }
    popup.taskVar = "https://example.com/m_task?id=\(tskid[indexPath.row])&uid=\(userID)"
    self.present(popup, animated: true, completion: nil) 
}

2. 优化WebView的加载时机

你的WebView控制器里,viewDidLoad只会在控制器第一次初始化时执行一次,如果后续复用这个控制器(比如多次present),旧的加载逻辑可能无法响应新的taskVar。推荐两种优化方式:

方式一:用属性监听自动加载

给taskVar添加didSet监听,只要值更新就立刻触发WebView加载:

var taskVar: String = "undefined" {
    didSet {
        // 安全转换URL,避免无效字符串导致崩溃
        if let url = URL(string: taskVar) {
            webView.loadRequest(URLRequest(url: url))
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // 第一次初始化时也执行一次加载
    if let url = URL(string: taskVar) {
        webView.loadRequest(URLRequest(url: url))
    }
}
方式二:在viewWillAppear中加载

每次控制器即将显示时,重新加载WebView,确保用的是最新的taskVar:

var taskVar: String = "undefined" 

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let url = URL(string: taskVar) {
        webView.loadRequest(URLRequest(url: url))
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // 这里可以去掉viewDidLoad里的加载逻辑了
}

3. 额外提示:避免强制解包

你原来的代码里用了UserDefaults.standard.string(forKey: "userID")!强制解包,如果userID不存在会直接崩溃,上面的代码已经用guard let做了安全处理,记得保留这个逻辑哦。

内容的提问来源于stack exchange,提问作者Nikita Vasin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:17