如何解决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 时错过了它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。