SwiftUi 按钮动作重新加载 WebView
SwiftUi Button action reload WebView
我有简单的 SwiftUi WebView 代码,我想在单击按钮时重新加载 WebView(我只添加了函数和简单代码)。
class myWebViewController: UIViewController, WKNavigationDelegate {
var webview: WKWebView
func reload(){
webview.reload()
}
}
override func viewDidLoad() {
super.viewDidLoad()
let overlayView = UIHostingController(rootView: NewRecordButton())
addChild(overlayView)
overlayView.view.backgroundColor = UIColor.clear
overlayView.view.frame = CGRect(x: 0, y: 0, width: 60, height: 60)
overlayView.view.isUserInteractionEnabled = true
self.view.addSubview(overlayView.view)
overlayView.didMove(toParent: self)
}
struct NewRecordButton: View {
@State var color = false
var body: some View {
HStack {
Spacer()
Button(action: {
myWebViewController().webview.reload() // HERE MY ACTION BUT DONT WORK
}, label: {
Text("+")
.font(.system(.largeTitle))
.frame(width: 35, height: 35)
.foregroundColor(Color.white)
.padding(.bottom, 7)
})
.background(Color.blue)
.cornerRadius(38.5)
.padding()
.shadow(color: Color.black.opacity(0.3),
radius: 3,
x: 3,
y: 3)
}
}
}
}
myWebViewController() 创建网络视图的新实例
您可以使用 NotificationCenter 来实现,在 class 需要刷新 Web 视图的地方注册观察者,例如在 viewDidLoad:
NotificationCenter.default.addObserver(self, selector: #selector(funcUpdateWebView(notification:)), name: NSNotification.Name(rawValue: "updateWebView"), object: nil)
然后设置更新功能(也在class需要更新网页视图的地方)
@objc func funcUpdateWebView(notification: NSNotification) {
webview.reload()
}
然后 post 来自另一个视图控制器(而不是 myWebViewController().webview.reload()
)的通知,如下所示:
NotificationCenter.default.post(name: NSNotification.Name("updateWebView"), object: nil)
这将完成工作。
另外不要忘记在任何函数之外首先 class 取消初始化此通知:
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "updateWebView"), object: nil)
}
更新:
另一种方法是委托。
protocol UpdateView {
func update()
}
通过将 UpdateView 添加到 class myWebViewController 来订阅 UpdateView 委托。
class myWebViewController: UIViewController, WKNavigationDelegate, UpdateView {
在 NewRecordButton 中创建弱变量委托:
struct NewRecordButton: View {
weak var delegate: UpdateView?
// Replace "myWebViewController().webview.reload()" with this line
// This will start update() function that will update webview in myWebViewController
self.delegate.update()
在 myWebViewController 中,为 newRecordButton 和函数设置委托,将重新加载 webView。
class myWebViewController: UIViewController, WKNavigationDelegate, UpdateView {
let NewRecordButton = NewRecordButton()
newRecordButton.delegate = self
...
func update() {
webview.reload()
}
...
}
我有简单的 SwiftUi WebView 代码,我想在单击按钮时重新加载 WebView(我只添加了函数和简单代码)。
class myWebViewController: UIViewController, WKNavigationDelegate {
var webview: WKWebView
func reload(){
webview.reload()
}
}
override func viewDidLoad() {
super.viewDidLoad()
let overlayView = UIHostingController(rootView: NewRecordButton())
addChild(overlayView)
overlayView.view.backgroundColor = UIColor.clear
overlayView.view.frame = CGRect(x: 0, y: 0, width: 60, height: 60)
overlayView.view.isUserInteractionEnabled = true
self.view.addSubview(overlayView.view)
overlayView.didMove(toParent: self)
}
struct NewRecordButton: View {
@State var color = false
var body: some View {
HStack {
Spacer()
Button(action: {
myWebViewController().webview.reload() // HERE MY ACTION BUT DONT WORK
}, label: {
Text("+")
.font(.system(.largeTitle))
.frame(width: 35, height: 35)
.foregroundColor(Color.white)
.padding(.bottom, 7)
})
.background(Color.blue)
.cornerRadius(38.5)
.padding()
.shadow(color: Color.black.opacity(0.3),
radius: 3,
x: 3,
y: 3)
}
}
}
}
myWebViewController() 创建网络视图的新实例
您可以使用 NotificationCenter 来实现,在 class 需要刷新 Web 视图的地方注册观察者,例如在 viewDidLoad:
NotificationCenter.default.addObserver(self, selector: #selector(funcUpdateWebView(notification:)), name: NSNotification.Name(rawValue: "updateWebView"), object: nil)
然后设置更新功能(也在class需要更新网页视图的地方)
@objc func funcUpdateWebView(notification: NSNotification) {
webview.reload()
}
然后 post 来自另一个视图控制器(而不是 myWebViewController().webview.reload()
)的通知,如下所示:
NotificationCenter.default.post(name: NSNotification.Name("updateWebView"), object: nil)
这将完成工作。
另外不要忘记在任何函数之外首先 class 取消初始化此通知:
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "updateWebView"), object: nil)
}
更新:
另一种方法是委托。
protocol UpdateView {
func update()
}
通过将 UpdateView 添加到 class myWebViewController 来订阅 UpdateView 委托。
class myWebViewController: UIViewController, WKNavigationDelegate, UpdateView {
在 NewRecordButton 中创建弱变量委托:
struct NewRecordButton: View {
weak var delegate: UpdateView?
// Replace "myWebViewController().webview.reload()" with this line
// This will start update() function that will update webview in myWebViewController
self.delegate.update()
在 myWebViewController 中,为 newRecordButton 和函数设置委托,将重新加载 webView。
class myWebViewController: UIViewController, WKNavigationDelegate, UpdateView {
let NewRecordButton = NewRecordButton()
newRecordButton.delegate = self
...
func update() {
webview.reload()
}
...
}