xcode - goForward 和 goBack 在 swiftui 中不起作用
问题描述
我正在尝试在 swiftui 中添加后退和前进按钮,但这些按钮不起作用。该 URL 来自火力基地。我关注了这个问题How to access goBack and goForward via UIViewRepresentable。如果有人帮助我,我非常感谢你。这是源代码
import SwiftUI
import WebKit
import Firebase
struct WebView: View {
@State var websiteURL: String
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
ZStack{
Color.init(red: 172/255, green: 198/255, blue: 224/255).edgesIgnoringSafeArea(.all)
VStack{
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Image("back").renderingMode(.original).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 60, alignment: .leading).padding()
}
Webview(web: nil, req: URLRequest(url: URL(string: websiteURL)!))
HStack{
Button(action: {
//go to back
Webview(web: nil, req: URLRequest(url: URL(string: websiteURL)!)).goBack()
}) {
Image(systemName: "arrow.left").foregroundColor(.black)
}
Spacer()
Button(action: {
// go forwared
Webview(web: nil, req: URLRequest(url: URL(string: websiteURL)!)).goForward()
}) {
Image(systemName: "arrow.right").foregroundColor(.black)
}
}.padding([.leading,.trailing],20)
}.navigationBarTitle("")
.navigationBarHidden(true)
}.onAppear{
self.loadURL()
}
}
func loadURL(){
//For Admin
let rootRef = Database.database().reference().child("Admin").child(websiteURL)
rootRef.observeSingleEvent(of: .value, with: { (snapshot) in
// Get user value
let value = snapshot.value as? NSDictionary
let getURL:String = value?["value"] as? String ?? ""
self.websiteURL=getURL
// ...
}) { (error) in
print(error.localizedDescription)
}
}
}
struct Webview : UIViewRepresentable {
let request: URLRequest
var webview: WKWebView?
init(web: WKWebView?, req: URLRequest) {
self.webview = WKWebView()
self.request = req
}
func makeUIView(context: Context) -> WKWebView {
return webview!
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.load(request)
}
func goBack(){
webview?.goBack()
}
func goForward(){
webview?.goForward()
}
}
struct WebView_Previews: PreviewProvider {
static var previews: some View {
WebView(websiteURL: "")
}
}
解决方案
我支持我的评论,您创建了 3 个不同的 Webview。这是使其工作的一种方法。复制并粘贴此代码,让我知道这是否适合您。
import SwiftUI
import WebKit
import Firebase
struct WebView: View {
@State var websiteURL: String
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
let websiteView = Webview()
var body: some View {
ZStack{
Color.init(red: 172/255, green: 198/255, blue: 224/255).edgesIgnoringSafeArea(.all)
VStack{
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Image("back").renderingMode(.original).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 60, alignment: .leading).padding()
}
self.websiteView
HStack{
Button(action: {
// go to back
self.websiteView.webview.goBack()
}) {
Image(systemName: "arrow.left").foregroundColor(.black)
}
Spacer()
Button(action: {
// go forwared
self.websiteView.webview.goForward()
}) {
Image(systemName: "arrow.right").foregroundColor(.black)
}
}.padding([.leading,.trailing],20)
}.navigationBarTitle("")
.navigationBarHidden(true)
}.onAppear{
self.loadURL()
}
}
func loadURL() {
//For Admin
let rootRef = Database.database().reference().child("Admin").child(websiteURL)
rootRef.observeSingleEvent(of: .value, with: { (snapshot) in
// Get user value
let value = snapshot.value as? NSDictionary
let getURL:String = value?["value"] as? String ?? ""
self.websiteURL = getURL
// new code <-----
self.websiteView.loadRequest(request: URLRequest(url: URL(string: self.websiteURL)!))
// ...
}) { (error) in
print(error.localizedDescription)
}
}
}
struct Webview : UIViewRepresentable {
@State var request: URLRequest?
let webview = WKWebView()
func makeUIView(context: Context) -> WKWebView {
return webview
}
func updateUIView(_ uiView: WKWebView, context: Context) {
if request != nil { uiView.load(request!) }
}
func loadRequest(request: URLRequest) {
self.request = request
webview.load(request)
}
func goBack(){
webview.goBack()
}
func goForward(){
webview.goForward()
}
}
推荐阅读
- java - java - 如何以随机方式擦洗Java中的出生日期,这会导致当我输入相同的原始出生日期时生成相同的随机数
- java - 不会在 android studio 的 firebase 中保存自定义 java 对象
- php - 在 Laravel 5.8 中根据所选类别显示产品?
- html - 从 pc 视图转到移动设备时,无法在响应式网站上的 div 内对齐(居中)文本
- asp.net - 文件夹的自定义路径
- javascript - 使用 jQuery 为复选框创建 PHP 友好数组
- azure-devops - 有没有办法让 Azure DevOps 版本只发布来自构建管道的实际最新更改?
- google-apps-script - 批处理和 API - 性能
- c# - 基于字符生成可跳过列表
- voice - 在microsoft最新的webchat v4.5.2中。如何使用像谷歌这样的自定义 STT/TTS 引擎。这在 v3 中使用 ISpeech 接口是可能的