ios - WKWebView 不显示导航栏

标签 ios swift swiftui wkwebview

我在 SwiftUI 中有一个 View ,显示一个 WKWebView,它使用 UIViewControllerRepresentable 类传递到主 ContentView,按照 Paul Huson's 'Creating a simple browser with WKWebView 中的说明实现。 。但是,当我在模拟器中加载应用程序时,似乎没有导航栏。

这是我的代码:

ContentViewBrowserView

struct ContentView: View {

    let browserView = BrowserView()
    var body: some View {
        browserView
    }
}

struct BrowserView: UIViewControllerRepresentable {

    func makeUIViewController(context: UIViewControllerRepresentableContext<BrowserView>) -> WKBrowser {
        let browser = WKBrowser()
        return browser
    }

    func updateUIViewController(_ uiViewController: WKBrowser, context: UIViewControllerRepresentableContext<BrowserView>) {
        // Empty
    }

}

WKBrowser

class WKBrowser: UIViewController, WKNavigationDelegate {

    var webView: WKWebView!

    var webURL = URL(string: "https://www.hackingwithswift.com")!

    override func loadView() {
        webView = WKWebView()
        webView?.navigationDelegate = self
        self.view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.load(URLRequest(url: webURL))
    }
}

结果:

The WKWebView

与教程中的 WKWebView 相比,它具有导航栏,如下所示:

enter image description here

我必须添加或编辑什么才能确保导航栏出现?

编辑 2020 年 5 月 19 日:

我想通过添加到 viewDidLoadnavigationItem.rightBarItem 函数将项目添加到导航栏,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
    webView.load(URLRequest(url: webURL))
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Open", style: .plain, target: self, action: #selector(someFunction)
}

@objc func someFunction(){
    // Do something
}

最佳情况下,结果看起来类似于 SFSafariViewController:

enter image description here

但是当我将 UIViewRepresentable 类包装在 NavigationView 中时,这些项目不会添加到出现的导航栏中,而是得到以下结果:

enter image description here

最佳答案

其实你有一个更简单的方法。

首先包装一个 WebView :

struct WebView: UIViewRepresentable {
    var url: URL
    
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        webView.load(request)
    }
}

然后你可以将 WebView 放入 VStack 中,这将使 UIView 像 SwiftUI 组件一样。一切正常!

   var body: some View {
        NavigationView {
            VStack {
                WebView(url: someURL)
            }
            .toolbar {
               // buttons here ....
            }
        }
   }

太棒了!

关于ios - WKWebView 不显示导航栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61881874/

相关文章:

iphone - 加载闪屏 Nib 时出现问题

swift - 全局声明对象还是仅在需要时声明对象更好

iOS 快速发布请求

SwiftUI .onDelete 在 TabView 中不起作用,因为 View 总是在变化

ios - SwiftUI:在预览中渲染一个对象,在设备上渲染另一个对象

android - android和ios设备之间的apprtc

ios - 不兼容的指针类型分配

IOS/objective-C :Animation of Multiple CGAffineTransformations

ios - Facebook 在 ios 和 swift 中使用 firebase 登录,但无法获取用户凭据

ios - 如何让 SwiftUI View 扩大可用空间?