Swift 5 开发:TabBar二次点击刷新对应控制器WKWebView遇nil问题
报错根因
你的代码中WebView始终为nil的核心原因是调用了手动新建的空视图控制器实例的方法,而非TabBar中实际运行的、完成视图绑定的真实控制器。
现存代码的具体问题
- 无效实例创建:在TabBar的点击代理方法中执行
let sendValue = ViewController1()时,系统会生成一个完全独立的ViewController1内存对象。这个对象没有关联Storyboard/XIB的视图绑定,所有@IBOutlet连接的webView1、bannerView_home属性都没有完成初始化,因此必然为nil,调用其reload方法不会产生任何实际效果。 - 计数逻辑失效:全局变量
VariableRefresh没有重置机制,计数达到2触发刷新后变量值不会清空,后续点击Tab时的判断逻辑会完全错乱。 - 非预期重载:在
viewWillAppear中硬编码每次视图出现都加载完整请求,会导致每次切回Tab都强制刷新页面,不符合仅双击时触发刷新的预期。
修复步骤
- 直接从TabBar的视图控制器数组中取出正在运行的ViewController1实例,禁止手动新建实例
- 替换原有的全局计数逻辑,用上次点击的Tab索引+时间窗口判断,准确识别"同一Tab双击"的交互
- 优化WebView的可选类型声明,增加安全校验,避免空实例崩溃
参考修复代码
替换原有TabBarClass中的全局变量和代理方法:
// 记录上次点击的Tab索引和点击时间,替代原有无状态的全局计数变量 private var lastTabTapIndex: Int = -1 private var lastTapTime: Date = Date() override func viewDidLoad() { super.viewDidLoad() debugPrint("Message - TabBarClass - viewDidLoad") self.delegate = self } func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController) ?? -1 // 判断是否为同一Tab的连续双击(0.5秒间隔内) if selectedIndex == lastTabTapIndex && Date().timeIntervalSince(lastTapTime) < 0.5 { // 从TabBar的控制器数组中取出真实存在的VC1实例 if let targetVC = tabBarController.viewControllers?[selectedIndex] as? ViewController1 { targetVC.reloadWebView() } // 触发后重置点击状态,避免重复触发 lastTabTapIndex = -1 lastTapTime = Date.distantPast return } // 更新当前点击状态 lastTabTapIndex = selectedIndex lastTapTime = Date() }
修改ViewController1中的相关代码:
// 将原有的强解包WebView改为可选类型 @IBOutlet var webView1: WKWebView? // 封装安全的WebView刷新方法 func reloadWebView() { // 仅当WebView实例存在、URL有效时才执行刷新 guard let webView = webView1, let targetURL = url1 else { return } webView.load(URLRequest(url: targetURL)) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 移除原有每次出现都加载请求的逻辑,避免非预期的页面重载 }
注意事项
- @IBOutlet连接的UI属性,只有在视图控制器完成视图加载(即viewDidLoad执行完毕)后才会被初始化。手动通过
init()创建的视图控制器不会自动加载关联的视图资源,因此所有Outlet属性永远为nil。 - 不要使用没有重置机制的全局变量做点击计数,结合上次点击索引、时间窗口的判断逻辑,才能准确识别双击交互,避免跨Tab点击、间隔过长的点击被误判为刷新触发条件。
内容的提问来源于stack exchange,提问作者Hollywood Family
相关产品推荐
相关产品推荐

