我正在尝试更新我的应用程序的 Web 视图控制器,其目的是验证用户的 Spotify 帐户。 VC 最初是使用 UIWebView 编码的,我正在尝试将其转换为较新的 WebKit。到目前为止一切顺利,但我无法在完成身份验证后关闭 webView。我很确定它与代表有关,这是一个我仍在努力理解的编程概念。提前致谢!
这是原始代码:
import UIKit
@objc protocol WebViewControllerDelegate {
func webViewControllerDidFinish(_ controller: WebViewController)
@objc optional func webViewController(_ controller: WebViewController, didCompleteInitialLoad didLoadSuccessfully: Bool)
}
class WebViewController: UIViewController {
// MARK: - Variables
var loadComplete: Bool = false
var initialURL: URL!
var webView: UIWebView!
var delegate: WebViewControllerDelegate?
// MARK: - Init
init(url URL: URL) {
super.init(nibName: nil, bundle: nil)
self.initialURL = URL
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
let initialRequest = URLRequest(url: self.initialURL)
webView = UIWebView(frame: self.view.bounds)
webView.delegate = self
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(self.webView)
let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.tappedDone))
navigationItem.leftBarButtonItem = doneBarButtonItem
webView.loadRequest(initialRequest)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .default
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
// MARK: - IBAction
@objc func tappedDone() {
delegate?.webViewControllerDidFinish(self)
presentingViewController?.dismiss(animated: true, completion: nil)
}
}
// MARK: - UIWebViewDelegate
extension WebViewController: UIWebViewDelegate {
func webViewDidFinishLoad(_ webView: UIWebView) {
if !loadComplete {
delegate?.webViewController?(self, didCompleteInitialLoad: true)
loadComplete = true
}
}
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
if !loadComplete {
delegate?.webViewController?(self, didCompleteInitialLoad: true)
loadComplete = true
}
}
}
这是我一直在编写的代码:
import UIKit
import WebKit
@objc protocol WebViewControllerDelegate {
func webViewControllerDidFinish(_ controller: WebViewController)
@objc optional func webViewController(_ controller: WebViewController, didCompleteInitialLoad didLoadSuccessfully: Bool)
}
class WebViewController: UIViewController {
// MARK: - Variables
var loadComplete: Bool = false
var initialURL: URL!
var webView: WKWebView!
var delegate: WebViewControllerDelegate?
// MARK: - Init
init(url URL: URL) {
super.init(nibName: nil, bundle: nil)
self.initialURL = URL
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
let initialRequest = URLRequest(url: self.initialURL)
webView = WKWebView(frame: self.view.bounds)
webView.navigationDelegate = self
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(self.webView)
let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.tappedDone))
navigationItem.leftBarButtonItem = doneBarButtonItem
doneBarButtonItem.tintColor = .systemBlue
webView.load(initialRequest)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
}
// MARK: - IBAction
@objc func tappedDone() {
delegate?.webViewControllerDidFinish(self)
presentingViewController?.dismiss(animated: true, completion: nil)
}
}
// MARK: - WKNavigationDelegate
extension WebViewController: WKNavigationDelegate {
func webViewDidFinishLoad(_ webView: WKWebView) {
if !loadComplete {
delegate?.webViewController?(self, didCompleteInitialLoad: true)
loadComplete = true
}
}
func webView(_ webView: WKWebView, didFailLoadWithError error: Error) {
if !loadComplete {
delegate?.webViewController?(self, didCompleteInitialLoad: true)
loadComplete = true
}
}
}