@@ -6,19 +6,22 @@ internal struct WindowBridgingView<V: View>: UIViewRepresentable {
6
6
var content : V
7
7
8
8
func makeUIView( context: Context ) -> _HelperView {
9
- let hostingController = UIHostingController ( rootView: EnvPassingView (
10
- content: content,
11
- environment: context. environment
12
- ) )
13
- hostingController. view. backgroundColor = . clear
14
- return _HelperView ( hostingController: hostingController)
9
+ return _HelperView (
10
+ isPresented: isPresented,
11
+ content: EnvPassingView (
12
+ content: content,
13
+ environment: context. environment
14
+ )
15
+ )
15
16
}
16
17
func updateUIView( _ helper: _HelperView , context: Context ) {
17
- helper. hostingController. rootView = EnvPassingView (
18
- content: content,
19
- environment: context. environment
18
+ helper. setContent (
19
+ isPresented: isPresented,
20
+ content: EnvPassingView (
21
+ content: content,
22
+ environment: context. environment
23
+ )
20
24
)
21
- helper. isPresented = isPresented
22
25
}
23
26
24
27
fileprivate struct EnvPassingView : View {
@@ -29,28 +32,53 @@ internal struct WindowBridgingView<V: View>: UIViewRepresentable {
29
32
content. environment ( \. self, environment)
30
33
}
31
34
}
32
-
35
+
33
36
internal final class _HelperView : UIView {
34
- var isPresented = false {
35
- didSet { overlayWindow ? . isHidden = !isPresented }
36
- }
37
+ private var isPresented : Bool
38
+ private var content : EnvPassingView
39
+
37
40
private var overlayWindow : WindowOverlayWindow ?
38
- fileprivate let hostingController : UIHostingController < EnvPassingView >
41
+ private var hostingController : UIHostingController < EnvPassingView > ? {
42
+ overlayWindow? . rootViewController as? UIHostingController < EnvPassingView >
43
+ }
39
44
40
- fileprivate init ( hostingController: UIHostingController < EnvPassingView > ) {
41
- self . hostingController = hostingController
45
+ fileprivate init ( isPresented: Bool , content: EnvPassingView ) {
46
+ self . isPresented = isPresented
47
+ self . content = content
42
48
super. init ( frame: . zero)
43
49
}
50
+
44
51
required init ? ( coder: NSCoder ) { fatalError ( ) }
45
52
46
53
override func willMove( toWindow newWindow: UIWindow ? ) {
47
54
super. willMove ( toWindow: newWindow)
48
55
if let windowScene = newWindow? . windowScene {
49
- overlayWindow = WindowOverlayWindow (
50
- windowScene: windowScene,
51
- rootViewController: hostingController
52
- )
53
- overlayWindow? . isHidden = !isPresented
56
+ overlayWindow = WindowOverlayWindow ( windowScene: windowScene)
57
+ updateView ( )
58
+ }
59
+ }
60
+
61
+ fileprivate func setContent(
62
+ isPresented: Bool ,
63
+ content: EnvPassingView
64
+ ) {
65
+ self . isPresented = isPresented
66
+ self . content = content
67
+ updateView ( )
68
+ }
69
+
70
+ private func updateView( ) {
71
+ if isPresented {
72
+ if hostingController == nil {
73
+ overlayWindow? . rootViewController = UIHostingController ( rootView: content)
74
+ overlayWindow? . rootViewController? . view. backgroundColor = . clear
75
+ } else {
76
+ hostingController? . rootView = content
77
+ }
78
+ overlayWindow? . isHidden = false
79
+ } else {
80
+ overlayWindow? . rootViewController = nil
81
+ overlayWindow? . isHidden = true
54
82
}
55
83
}
56
84
}
0 commit comments