From 08b3c120082d214abde7ef6239ce0685be41f387 Mon Sep 17 00:00:00 2001 From: CypherPoet Date: Wed, 20 Feb 2019 18:32:55 -0500 Subject: [PATCH] Implement main webView functionality - functionality for adding and deleting web views - functionality for typing addresses in the search bar and triggering page loads in the active web view --- .../Multibrowser/Base.lproj/Main.storyboard | 18 ++- .../Multibrowser/HomeViewController.swift | 112 ++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/31-ipad-multitasking/Multibrowser/Multibrowser/Base.lproj/Main.storyboard b/31-ipad-multitasking/Multibrowser/Multibrowser/Base.lproj/Main.storyboard index 2b5b0de..aa14be6 100644 --- a/31-ipad-multitasking/Multibrowser/Multibrowser/Base.lproj/Main.storyboard +++ b/31-ipad-multitasking/Multibrowser/Multibrowser/Base.lproj/Main.storyboard @@ -40,15 +40,29 @@ - + + + + + + + + + + + + + + + - + diff --git a/31-ipad-multitasking/Multibrowser/Multibrowser/HomeViewController.swift b/31-ipad-multitasking/Multibrowser/Multibrowser/HomeViewController.swift index 44c52e2..1039686 100644 --- a/31-ipad-multitasking/Multibrowser/Multibrowser/HomeViewController.swift +++ b/31-ipad-multitasking/Multibrowser/Multibrowser/HomeViewController.swift @@ -7,16 +7,128 @@ // import UIKit +import WebKit + +let defaultTitle = "Web View Wonderland" class HomeViewController: UIViewController { @IBOutlet weak var addressBar: UITextField! @IBOutlet weak var stackView: UIStackView! + @IBOutlet weak var deleteWebViewButton: UIBarButtonItem! + + lazy var defaultURL = URL(string: "https://developer.apple.com/develop/")! + + weak var activeWebView: WKWebView! { + didSet { + activeWebViewChanged() + } + } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. + addressBar.delegate = self + setupDefaultUI() } + + + func activeWebViewChanged() { + if activeWebView == nil { + setupDefaultUI() + } else { + title = activeWebView.title + deleteWebViewButton.isEnabled = true + + for view in stackView.arrangedSubviews { + view.layer.borderWidth = 0 + } + + activeWebView.layer.borderWidth = 3 + } + } + + + func setupDefaultUI() { + deleteWebViewButton.isEnabled = false + title = defaultTitle + } + + func replaceActiveWebView(afterDeletingFromIndex previousIndex: Int) { + if stackView.arrangedSubviews.isEmpty { + activeWebView = nil + } else { + // if that was the last web view in the stack, move the index back one + let targetIndex = min(previousIndex, stackView.arrangedSubviews.count - 1) + activeWebView = stackView.arrangedSubviews[targetIndex] as? WKWebView ?? nil + } + } + + + @IBAction func deleteWebView(_ sender: Any) { + guard activeWebView != nil else { return } + + if let index = stackView.arrangedSubviews.firstIndex(of: activeWebView) { + stackView.removeArrangedSubview(activeWebView) + activeWebView.removeFromSuperview() + + replaceActiveWebView(afterDeletingFromIndex: index) + } + } + + + @IBAction func addWebView(_ sender: Any) { + let webView = WKWebView() + let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(webViewTapped)) + + webView.navigationDelegate = self + webView.layer.borderColor = UIColor.blue.cgColor + + gestureRecognizer.delegate = self + webView.addGestureRecognizer(gestureRecognizer) + + stackView.addArrangedSubview(webView) + webView.load(URLRequest(url: defaultURL)) + activeWebView = webView + } } + +extension HomeViewController: WKNavigationDelegate { + +} + + + +extension HomeViewController: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + if activeWebView != nil, let address = addressBar.text { + if let url = URL(string: address) { + activeWebView.load(URLRequest(url: url)) + } + } + + textField.resignFirstResponder() + return true + } +} + + +extension HomeViewController: UIGestureRecognizerDelegate { + /** + Tell iOS we want our own gesture recognizer to trigger alongside the recognizers built in to each WKWebView + */ + func gestureRecognizer( + _ gestureRecognizer: UIGestureRecognizer, + shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer + ) -> Bool { + return true + } + + @objc func webViewTapped(sender: UITapGestureRecognizer) { + if let webView = sender.view as? WKWebView { + activeWebView = webView + } + } +}