由于我是 Swift 新手,我不确定如何为 Swift 编写一个函数,以便从 Web 应用程序进行交互式 Javascript 警报和确认。我正在使用 SwiftUI 创建一个 Web 应用程序,需要为我的 Swift Web 应用程序实现一个功能,以从 Web 应用程序正确显示 Javascript 警报和确认。
这是我到目前为止的代码。
import SwiftUI
import WebKit
struct Webview : UIViewRepresentable {
let request: URLRequest
var webview: WKWebView?
init(web: WKWebView?, req: URLRequest) {
self.webview = WKWebView()
self.request = req
}
class Coordinator: NSObject, WKUIDelegate {
var parent: Webview
init(_ parent: Webview) {
self.parent = parent
}
// Delegate methods go here
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
// alert functionality goes here
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> WKWebView {
return webview!
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.uiDelegate = context.coordinator
uiView.load(request)
}
func goBack(){
webview?.goBack()
}
func goForward(){
webview?.goForward()
}
func reload(){
webview?.reload()
}
}
struct ContentView: View {
let webview = Webview(web: nil, req: URLRequest(url: URL(string: "https://google.com")!))
var body: some View {
VStack {
webview
HStack() {
Button(action: {
self.webview.goBack()
}){
Image(systemName: "chevron.left")
}.padding(32)
Button(action: {
self.webview.reload()
}){
Image(systemName: "arrow.clockwise")
}.padding(32)
Button(action: {
self.webview.goForward()
}){
Image(systemName: "chevron.right")
}.padding(32)
}.frame(height: 40)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如何添加一个功能来显示Alert
and Confirm
正确地进入我上面的现有代码?
如果你想坚持UIViewRepresentable
并使用来自的警报UIKit
(例如UIAlertController
)而不是 SwiftUI 的 Alert:
-
在你的中创建一个函数Webview
结构体显示一个UIKit
alert:
func showAlert(_ message: String) {
let alertController = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
// You need to access the UIWindow of the app to present the alert
if let viewController = UIApplication.shared.windows.first?.rootViewController {
viewController.present(alertController, animated: true, completion: nil)
}
}
-
修改您的 JavaScript 函数以在显示警报时调用此 Swift 函数:
function showAlert(message) {
window.webkit.messageHandlers.alertHandler.postMessage(message);
}
-
In the userContentController(_:didReceive:)
方法,调用showAlert
当你收到来自 JavaScript 的消息时函数:
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "alertHandler", let messageBody = message.body as? String {
showAlert(messageBody)
}
}
当 JavaScriptfunction showAlert(message)
从您的网页调用,它将触发showAlert
Webview 结构中的函数,它将显示UIKit
在您的 SwiftUI 应用程序中使用警报UIAlertController
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)