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
This commit is contained in:
CypherPoet 2019-02-20 18:32:55 -05:00
parent 42c0d46cec
commit 08b3c12008
2 changed files with 128 additions and 2 deletions

View File

@ -40,15 +40,29 @@
</constraints>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
<navigationItem key="navigationItem" id="nfO-E2-nuf"/>
<navigationItem key="navigationItem" id="nfO-E2-nuf">
<rightBarButtonItems>
<barButtonItem systemItem="add" id="D7y-wQ-NkI">
<connections>
<action selector="addWebView:" destination="BYZ-38-t0r" id="qBD-ti-G5m"/>
</connections>
</barButtonItem>
<barButtonItem systemItem="trash" id="nBz-Mn-Hrb">
<connections>
<action selector="deleteWebView:" destination="BYZ-38-t0r" id="zJa-Jg-Fk1"/>
</connections>
</barButtonItem>
</rightBarButtonItems>
</navigationItem>
<connections>
<outlet property="addressBar" destination="jYU-dR-unr" id="9D7-0X-x74"/>
<outlet property="deleteWebViewButton" destination="nBz-Mn-Hrb" id="JrK-bc-UYZ"/>
<outlet property="stackView" destination="Wqs-Qr-mVC" id="6eG-0Q-lNL"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="934.53237410071949" y="133.81294964028777"/>
<point key="canvasLocation" x="939" y="134"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="sYu-kN-pLc">

View File

@ -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
}
}
}