UIToolbar Items 和 UIBarButtonItem 没有出现在模拟器中或被切断,我错过了啥吗?

Posted

技术标签:

【中文标题】UIToolbar Items 和 UIBarButtonItem 没有出现在模拟器中或被切断,我错过了啥吗?【英文标题】:UIToolbarItems and UIBarButtonItems not appearing in simulator or getting cut off, am I missing something?UIToolbar Items 和 UIBarButtonItem 没有出现在模拟器中或被切断,我错过了什么吗? 【发布时间】:2019-05-04 01:51:44 【问题描述】:

我用一些UIBarButtonItems 以编程方式创建了一个WKWebView。右上角有一个“打开”按钮,底部有 3 个UIToolbarItems ProgressView、flexibleSpace 和重新加载按钮。我的模拟器无法将这些加载到屏幕上,并且看起来在模拟器上加载不正确。

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

我尝试了不同的屏幕尺寸,但似乎没有一个能让 UIBarButtonItems 和 UIToolbarItems 出现在模拟器上。

what my iphoneXR simulator looks like at the moment

【问题讨论】:

您在使用界面生成器吗? documentation for loadView() 表示如果您将 Interface Builder 用于您的视图,则不要覆盖 loadView() @Chris 我没有更改 IB 中的任何内容,我以编程方式完成了所有操作 【参考方案1】:

您需要将ViewController 嵌入到导航控制器中。

打开你的故事板 -> 编辑器 -> 嵌入 -> 导航控制器。

此外,您的代码在 navigationController?.isToolbarHidden = false 之后缺少一个花括号,以关闭 viewDidLoad 方法。

【讨论】:

哇,我完全忘记在我的 VC 中嵌入导航控制器了!

以上是关于UIToolbar Items 和 UIBarButtonItem 没有出现在模拟器中或被切断,我错过了啥吗?的主要内容,如果未能解决你的问题,请参考以下文章

UISegmentedControl 不响应 UIToolbar 中的 UIControlEventValueChanged

更改 UIToolbar 项目将两个按钮放在一起

实现 UIToolBar 使其同时充当 UITabBar 和 UIToolBar

iOS 11 键盘和附件视图之间的额外空间

iOS 7.1 UINavigationbar 和 UIToolbar

UIViewController:UITableView 和 UIToolbar 之间的空白