iosswiftuiviewuibarbuttonitemuitoolbaritem

UIToolbarItems and UIBarButtonItems not appearing in simulator or getting cut off, am I missing something?


I have created a WKWebView programmatically with some UIBarButtonItems. A "Open" button on the top right, and 3 UIToolbarItems on the bottom for ProgressView, flexibleSpace, and reload button. My simulator is not able to load these onto the screen and looks like it is loaded improperly on the simulator.

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    var webView: WKWebView!
    var progressView: UIProgressView!
    var websites = ["apple.com", "google.com"]

//loadView() func
override func loadView() {

    //create an instance of WKWebView()
    webView = WKWebView()
    webView.navigationDelegate = self
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()

    //get URL and make a load URLRequest
    guard let url = URL(string: "https://www." + websites[0]) else { return }
    webView.load(URLRequest(url: url))
    webView.allowsBackForwardNavigationGestures = true

    //set BarButtonItem on the top right of page
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Open", style: .plain, target: self, action: #selector(openTapped))

    //add UIToolbar items with UIBarButtonItems
    let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let reload = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(webView.reload))

    //add progressView
    progressView = UIProgressView(progressViewStyle: .default)
    progressView.sizeToFit()
    let progressButton = UIBarButtonItem(customView: progressView)

    //add items to toolbarItems array
    toolbarItems = [progressButton, spacer, reload]
    navigationController?.isToolbarHidden = false

//create actionSheet UIAlertActionController for bar button drop down
@objc func openTapped() {
    let alert = UIAlertController(title: "Open new page!", message: nil, preferredStyle: .actionSheet)

    for website in websites {
        alert.addAction(UIAlertAction(title: website, style: .default, handler: openPage))
    }

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
    alert.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
    present(alert, animated: true)
}

//handlers for each UIAlertAction
func openPage(action: UIAlertAction) {
    guard let actionTitle = action.title else { return }
    guard let url = URL(string: "https://" + actionTitle) else { return }
    webView.load(URLRequest(url: url))
}

//set webView title to web page title
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    title = webView.title
}

I have tried different screen sizes, but none seem to make UIBarButtonItems and UIToolbarItems appear on simulator.

what my iphoneXR simulator looks like at the moment


Solution

  • You need to embedded your ViewController in a Navigation Controller.

    Open your storyboard -> Editor -> Embed in -> Navigation Controller.

    Also, your code is missing a curly brace after navigationController?.isToolbarHidden = false to close the viewDidLoad method.