我在SwiftUI中有一个视图,显示了一个WKWebView
,该视图使用UIViewControllerRepresentable
类传递给了主ContentView,该类是按照Paul Huson's 'Creating a simple browser with WKWebView的指示实现的。但是,当我在模拟器中加载应用程序时,似乎没有导航栏。
这是我的代码:
ContentView
和BrowserView
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))
}
}
结果:
与本教程中具有导航栏的WKWebView相比,如下所示:
要确保显示导航栏,我必须添加或编辑什么?
编辑05/19/2020:
我想通过navigationItem.rightBarItem
函数将项目添加到导航栏中,并添加到viewDidLoad
中,如下所示:
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
:
但是,当我将UIViewRepresentable
类包装在NavigationView
中时,这些项目没有添加到显示的导航栏中,而是得到了:
答案 0 :(得分:1)
如果要使用UIKit部分中的导航栏,则需要将UIKit浏览器包装在UINavigationController
中,如下所示
使用Xcode 11.4 / iOS 13.4进行了测试
struct BrowserView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UINavigationController {
let browser = WKBrowser()
return UINavigationController(rootViewController: browser)
}
func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {
// Empty
}
}
答案 1 :(得分:0)
在遵循同一教程的同时,我正在使用Xcode 14。嵌入到Navigation Controller中可以解决该问题,而无需更改教程中的任何代码。