Skip to content

Commit b910296

Browse files
committed
Update WebView
1 parent 7cd16a9 commit b910296

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

Sources/SwiftUIX/Intramodular/Web/WebView.swift

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -170,30 +170,41 @@ struct _WKWebViewRepresentable: AppKitOrUIKitViewRepresentable {
170170

171171
context.coordinator.webView = view
172172

173-
switch configuration.source {
174-
case .url:
175-
break
176-
case .htmlString(let string):
177-
view.loadHTMLString(string, baseURL: nil)
178-
}
179-
180-
DispatchQueue.main.async {
181-
self.appKitOrUIKitViewBinding?.wrappedValue = view
173+
if let appKitOrUIKitViewBinding = self.appKitOrUIKitViewBinding {
174+
DispatchQueue.main.async {
175+
if appKitOrUIKitViewBinding.wrappedValue !== view {
176+
appKitOrUIKitViewBinding.wrappedValue = view
177+
} else {
178+
view._SwiftUIX_setNeedsLayout()
179+
}
180+
}
182181
}
183182

184183
return view
185184
}
186185

187186
func updateAppKitOrUIKitView(_ view: AppKitOrUIKitViewType, context: Context) {
187+
if view.navigationDelegate !== context.coordinator {
188+
view.navigationDelegate = context.coordinator
189+
190+
view.reload()
191+
}
192+
188193
view._SwiftUIX_configuration = configuration
189194

190-
switch configuration.source {
191-
case .url(let url):
192-
if url != coordinator.activeLoadRequest?.url {
193-
coordinator.load(url)
194-
}
195-
case .htmlString:
196-
break
195+
if view._latestSource != configuration.source {
196+
defer {
197+
view._latestSource = configuration.source
198+
}
199+
200+
switch configuration.source {
201+
case .url(let url):
202+
if url != coordinator.activeLoadRequest?.url {
203+
coordinator.load(url)
204+
}
205+
case .htmlString(let string):
206+
view.loadHTMLString(string, baseURL: nil)
207+
}
197208
}
198209
}
199210

@@ -220,7 +231,6 @@ extension _WKWebViewRepresentable {
220231
didSet {
221232
activeLoadRequest = nil
222233
oldValue?.navigationDelegate = nil
223-
webView?.navigationDelegate = self
224234
}
225235
}
226236

@@ -229,14 +239,18 @@ extension _WKWebViewRepresentable {
229239
var activeLoadRequest: LoadRequest?
230240

231241
func load(_ url: URL) {
242+
guard let webView else {
243+
return
244+
}
245+
232246
self.activeLoadRequest = nil
233247
self.activeLoadRequest = .init(url: url, redirectedURL: nil)
234248

235249
DispatchQueue.main.async {
236250
self.isLoading = true
237251
}
238252

239-
webView?.load(URLRequest(url: url))
253+
webView.load(URLRequest(url: url))
240254
}
241255

242256
func webView(

Sources/SwiftUIX/Intramodular/Web/_SwiftUIX_WKWebView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public final class _SwiftUIX_WKWebView: WKWebView, WKNavigationDelegate {
2020
}
2121
}
2222

23+
var _latestSource: _WKWebViewRepresentable.Configuration.Source?
24+
2325
public override init(frame: CGRect, configuration: WKWebViewConfiguration) {
2426
super.init(frame: frame, configuration: configuration)
2527

0 commit comments

Comments
 (0)