Swift 5 - 用户第二次单击标签栏按钮后,需要帮助在视图控制器 1 上重新加载 Web 视图

问题描述

在过去的一周里,我被困在这个问题上大约 30 多个小时试图解决这个问题,但似乎无法解决这个问题。我有一个 Swift 5 iOS 应用程序。它有一个带有 3 个选项卡/视图控制器的选项卡栏视图控制器。我所有的代码都存储在一个视图控制器文件中。下面是标签栏和第一个视图控制器的代码,所有其他视图控制器的结构类似。

预期:当用户在选项卡上单击两次时,我们会将他们单击的次数存储在名为 VariableRefresh 的变量中。当该变量变为 2 时,我们将刷新视图控制器上的 Web 视图。

当我为视图控制器 1 单击两次标签栏时,调试打印消息被触发,这告诉我两次单击标签栏是成功的,但 Web 视图没有刷新。我收到错误消息,说 web 视图返回 nil 并使其成为可选值。所以我补充?到 web 视图以使其成为可选值,但问题是 web 视图仍然为零,并且它不会刷新/重新加载。 func reload 应在用户按两次标签栏时调用,并且应执行视图控制器 1 func reload() 中的函数

import GoogleMobileAds
import UIKit
import SwiftUI
import FBAudienceNetwork
import WebKit

//we will use this to identifiy if two click are made on this tab,we will put if then statement to monitor clicks and if 2 taps ont he tab,then we will refresh the view controller 1 webview.
var VariableRefresh = 0


//variable for url
let url1 = URL(string:"http://tesla1.social-goat.com")
//variable for url request
let request = URLRequest(url: url1!)





class TabBarClass: UITabBarController,UITabBarControllerDelegate,WKNavigationDelegate  {
    
    
    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)!
        if selectedindex == 0 {
          debugPrint("Message - loaded func tabBarController")
            VariableRefresh += 1
            
            if VariableRefresh == 2
            {
            let sendValue = ViewController1();
            sendValue.reload()
            
            }
        }


        
    }
    
}

//################  view controller 1 - Groups START
class ViewController1: UIViewController,FBAdViewDelegate{
    
   
    let url1 = URL(string:"http://tesla1.social-goat.com")
    //
  
    @IBOutlet var webView1: WKWebView!
    @IBOutlet weak var bannerView_home: GADBannerView!
    
    override func viewDidLoad(){
        super.viewDidLoad()
        //moved request to the parent level so that viewcontroller1 and tab bar view controller can access
      //  let request = URLRequest(url: url1!)
        debugPrint("Message - viewDidLoad")
        //load request for webview
        webView1.load(request)
        //allow webvie to have back and forward browsing function by swip left or right
        webView1.allowsBackForwardNavigationGestures = true
        webView1.navigationDelegate = self
        webView1.isUserInteractionEnabled = true
       
        
     //banner id ca-app-pub-8404457641397226/8691324688
    //test banner id ca-app-pub-3940256099942544/2435281174
    // Replace this ad unit ID with your own ad unit ID.
    bannerView_home.adUnitID = "ca-app-pub-8404457641397226/8691324688"
    bannerView_home.rootViewController = self
        
    //lets load the admob banner
        loadBannerAd()
        
       
 
        }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
   //this will be called from tab bar view,the problem here is that webview will come up as nil. putting ? or ! still does not reload the webview.
    func reload(){
        webView1.load(request)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        debugPrint("Viewwillapper")
        let request = URLRequest(url: url1!)
        //reload webview when you navigate back to the view controller 1 tab
        webView1.load(request)
        
        
    }
    
   
  
    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
      // Note loadBannerAd is called in viewDidAppear as this is the first time that
      // the safe area is kNown. If safe area is not a concern (eg your app is locked
      // in portrait mode) the banner can be loaded in viewDidLoad.
     
    }

    override func viewWillTransition(
      to size: CGSize,with coordinator: UIViewControllerTransitionCoordinator
    ) {
      coordinator.animate(alongsideTransition: { _ in
        self.loadBannerAd()
      })
    }

    func loadBannerAd() {

      // Here safe area is taken into account,hence the view frame is used after the
      // view has been laid out.
      let frame = { () -> CGRect in
        if #available(iOS 11.0,*) {
          return view.frame.inset(by: view.safeAreaInsets)
        } else {
          return view.frame
        }
      }()
      let viewWidth = frame.size.width

      // Here the current interface orientation is used. If the ad is being preloaded
      // for a future orientation change or different orientation,the function for the
      // relevant orientation should be used.
      bannerView_home.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)

      bannerView_home.load(GADRequest())
    }
    
}


//################  view controller 1 - Groups END

解决方法

当你调用 let sendValue = ViewController1();您创建与您的实现断开连接的视图控制器的全新实例。尝试替换 let sendValue = ViewController1();使用 let sendValue = tabBarController.viewControllers[0] 作为 ViewController1!在您的标签栏控制器类中。然后你应该可以调用sendValue.reload()。我第一次尝试从不同的班级调用 reload 时错过了它。