Assume you have this WKWebView implementation:
import Combine
import SwiftUI
import WebKit
class WebViewData: ObservableObject {
@Published var parsedText: NSAttributedString? = nil
var isInit = false
var shouldUpdateView = true
}
struct WebView: UIViewRepresentable {
let text: String
@ObservedObject var data: WebViewData
func makeUIView(context: Context) -> WKWebView {
context.coordinator.view.navigationDelegate = context.coordinator
return context.coordinator.view
}
func updateUIView(_ uiView: WKWebView, context: Context) {
guard data.shouldUpdateView else {
data.shouldUpdateView = false
return
}
let html = """
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
</head>
<body>
\(text)
<script>
let isScrolling = false;
let timer;
function toggleScrolling() {
if(!isScrolling) {
timer = setInterval(function() {
window.scrollBy(0, 1);
}, \(80 / autoScrollVelocity));
} else {
clearInterval(timer)
}
isScrolling = !isScrolling;
}
</script>
</body>
</html>
"""
uiView.loadHTMLString(html, baseURL: nil)
}
func makeCoordinator() -> WebViewCoordinator {
return WebViewCoordinator(view: self)
}
}
class WebViewCoordinator: NSObject, WKNavigationDelegate {
let view: WebView
init(view: WebView) {
self.view = view
super.init()
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DispatchQueue.main.async {
if !self.view.data.isInit {
self.view.data.isInit = true
// useless text parsing here...
}
}
}
}
in this view
import SwiftUI
struct ReadingView: View {
@ObservedObject var webViewData = WebViewData()
private let text: String
init(text: String?) {
self.text = text ?? "Sorry, this reading is empty"
}
var body: some View {
VStack {
Button("Auto scroll") {
??????
}
WebView(title: self.title, text: self.text, data: self.webViewData)
}
.onReceive(self.webViewData.$parsedText, perform: { parsedText in
if let parsedText = parsedText {
print(parsedText)
}
})
}
}
Now, in the button with label Auto scroll, how is it possible to call the javascript inside the html toggleScrolling() (or moving this code in a WKUserScript if necessary)? I'm pretty lost here.
Thanks in advance for any suggestion