@@ -41,10 +41,19 @@ public enum PageSheet {
41
41
@State
42
42
private var configuration : Configuration = . default
43
43
44
+ @State
45
+ private var selectedDetent : Detent . Identifier ?
46
+
44
47
let content : Content
45
48
46
49
var body : some View {
47
- HostingView ( configuration: $configuration, content: content)
50
+ HostingView ( configuration: $configuration, selectedDetent: $selectedDetent, content: content)
51
+ . onChange ( of: selectedDetent) { newValue in
52
+ self . configuration. selectedDetentIdentifier = newValue
53
+ }
54
+ . onPreferenceChange ( Preference . SelectedDetentIdentifier. self) { newValue in
55
+ self . selectedDetent = newValue
56
+ }
48
57
. onPreferenceChange ( Preference . GrabberVisible. self) { newValue in
49
58
self . configuration. prefersGrabberVisible = newValue
50
59
}
@@ -54,9 +63,6 @@ public enum PageSheet {
54
63
. onPreferenceChange ( Preference . LargestUndimmedDetentIdentifier. self) { newValue in
55
64
self . configuration. largestUndimmedDetentIdentifier = newValue
56
65
}
57
- . onPreferenceChange ( Preference . SelectedDetentIdentifier. self) { newValue in
58
- self . configuration. selectedDetentIdentifier = newValue
59
- }
60
66
. onPreferenceChange ( Preference . EdgeAttachedInCompactHeight. self) { newValue in
61
67
self . configuration. prefersEdgeAttachedInCompactHeight = newValue
62
68
}
@@ -71,6 +77,7 @@ public enum PageSheet {
71
77
self . configuration. preferredCornerRadius = newValue
72
78
}
73
79
. ignoresSafeArea ( )
80
+ . environment ( \. _selectedDetentIdentifier, self . selectedDetent)
74
81
}
75
82
}
76
83
@@ -82,9 +89,12 @@ public enum PageSheet {
82
89
var configuration : Configuration = . default {
83
90
didSet {
84
91
if let sheet = self . sheetPresentationController {
85
- sheet. delegate = self
92
+ if sheet. delegate == nil {
93
+ sheet. delegate = self
94
+ }
95
+
96
+ let config = self . configuration
86
97
sheet. animateChanges {
87
- let config = self . configuration
88
98
sheet. prefersGrabberVisible = config. prefersGrabberVisible
89
99
sheet. detents = config. detents
90
100
sheet. largestUndimmedDetentIdentifier = config. largestUndimmedDetentIdentifier
@@ -94,70 +104,57 @@ public enum PageSheet {
94
104
sheet. prefersScrollingExpandsWhenScrolledToEdge =
95
105
config. prefersScrollingExpandsWhenScrolledToEdge
96
106
sheet. preferredCornerRadius = config. preferredCornerRadius
97
-
98
- self . selectedDetentChanged ? ( config. selectedDetentIdentifier)
99
107
sheet. selectedDetentIdentifier = config. selectedDetentIdentifier
100
108
}
101
109
}
102
110
}
103
111
}
104
112
105
- var selectedDetentChanged : ( ( Detent . Identifier ? ) -> Void ) ?
113
+ @Binding
114
+ var selectedDetent : Detent . Identifier ?
115
+
116
+ init ( rootView: Content , selectedDetent: Binding < Detent . Identifier ? > ) {
117
+ self . _selectedDetent = selectedDetent
118
+ super. init ( rootView: rootView)
119
+ }
120
+
121
+ @MainActor @objc required dynamic init ? ( coder aDecoder: NSCoder ) {
122
+ fatalError ( " init(coder:) has not been implemented " )
123
+ }
106
124
107
125
// MARK: UISheetPresentationControllerDelegate
108
126
109
127
func sheetPresentationControllerDidChangeSelectedDetentIdentifier(
110
128
_ sheet: UISheetPresentationController
111
129
) {
112
- selectedDetentChanged ? ( sheet. selectedDetentIdentifier)
130
+ self . selectedDetent = sheet. selectedDetentIdentifier
113
131
}
114
132
}
115
133
116
134
// MARK: - HostingView
117
135
118
136
fileprivate struct HostingView < Content: View > : UIViewControllerRepresentable {
119
- typealias ModifiedView = ModifiedContent <
120
- Content , ApplySelectedDetentEnvironmentValueViewModifier
121
- >
122
-
123
137
@Binding
124
138
var configuration : Configuration
125
139
140
+ @Binding
141
+ var selectedDetent : Detent . Identifier ?
142
+
126
143
@State
127
144
private var selectedDetentIdentifier : Detent . Identifier ?
128
145
129
146
let content : Content
130
147
131
- func makeUIViewController( context: Context ) -> HostingController < ModifiedView > {
148
+ func makeUIViewController( context: Context ) -> HostingController < Content > {
132
149
HostingController (
133
- rootView: content. modifier (
134
- ApplySelectedDetentEnvironmentValueViewModifier (
135
- selectedDetentIdentifier: $selectedDetentIdentifier
136
- )
137
- )
150
+ rootView: content,
151
+ selectedDetent: $selectedDetent
138
152
)
139
153
}
140
154
141
- func updateUIViewController( _ controller: HostingController < ModifiedView > , context: Context ) {
142
- controller. selectedDetentChanged = { newDetent in
143
- // FIXME: this causes issues since it is drawing during a state update. Need to figure out how to... not do that.
144
- // self.selectedDetentIdentifier = $0
145
- }
155
+ func updateUIViewController( _ controller: HostingController < Content > , context: Context ) {
146
156
controller. configuration = configuration
147
- controller. rootView = content. modifier (
148
- ApplySelectedDetentEnvironmentValueViewModifier (
149
- selectedDetentIdentifier: $selectedDetentIdentifier
150
- )
151
- )
152
- }
153
- }
154
-
155
- fileprivate struct ApplySelectedDetentEnvironmentValueViewModifier : ViewModifier {
156
- @Binding
157
- var selectedDetentIdentifier : Detent . Identifier ?
158
-
159
- func body( content: Content ) -> some View {
160
- content. environment ( \. _selectedDetentIdentifier, selectedDetentIdentifier)
157
+ controller. rootView = content
161
158
}
162
159
}
163
160
}
0 commit comments