@@ -37,9 +37,6 @@ struct OptionalCaseIterableFlagControl<Value>: View
3737 @Binding
3838 var showDetail : Bool
3939
40- @Binding
41- var showPicker : Bool
42-
4340 // MARK: - View Body
4441
4542 var content : some View {
@@ -53,7 +50,7 @@ struct OptionalCaseIterableFlagControl<Value>: View
5350 var body : some View {
5451 HStack {
5552 if self . isEditable {
56- NavigationLink ( destination: self . selector, isActive : self . $showPicker ) {
53+ NavigationLink ( destination: self . selector) {
5754 self . content
5855 }
5956 } else {
@@ -66,82 +63,92 @@ struct OptionalCaseIterableFlagControl<Value>: View
6663#if os(iOS)
6764
6865 var selector : some View {
69- return self . selectorList
66+ SelectorList ( value : self . $value )
7067 . navigationBarTitle ( Text ( self . label) , displayMode: . inline)
7168 }
7269
7370#else
7471
7572 var selector : some View {
76- return self . selectorList
73+ SelectorList ( value : self . $value )
7774 }
7875
7976#endif
8077
81- var selectorList : some View {
82- Form {
83- Section {
84- Button (
85- action: {
86- self . valueSelected ( nil )
87- } ,
88- label: {
89- Text ( " None " )
90- . foregroundColor ( . primary)
91- Spacer ( )
92-
93- if self . value. wrapped == nil {
94- self . checkmark
78+ struct SelectorList : View {
79+ @Binding
80+ var value : Value
81+
82+ @Environment ( \. presentationMode)
83+ private var presentationMode
84+
85+ var body : some View {
86+ Form {
87+ Section {
88+ Button (
89+ action: {
90+ self . valueSelected ( nil )
91+ } ,
92+ label: {
93+ HStack {
94+ Text ( " None " )
95+ . foregroundColor ( . primary)
96+ Spacer ( )
97+
98+ if self . value. wrapped == nil {
99+ self . checkmark
100+ }
101+ }
95102 }
96- }
97- )
98- }
103+ )
104+ }
99105
100- ForEach ( Value . WrappedFlagValue. allCases, id: \. self) { value in
101- Button (
102- action: {
103- self . valueSelected ( value)
104- } ,
105- label: {
106- FlagDisplayValueView ( value: value)
107- Spacer ( )
108-
109- if value == self . value. wrapped {
110- self . checkmark
106+ ForEach ( Value . WrappedFlagValue. allCases, id: \. self) { value in
107+ Button (
108+ action: {
109+ self . valueSelected ( value)
110+ } ,
111+ label: {
112+ HStack {
113+ FlagDisplayValueView ( value: value)
114+ . foregroundColor ( . primary)
115+ Spacer ( )
116+
117+ if value == self . value. wrapped {
118+ self . checkmark
119+ }
120+ }
111121 }
112- }
113- )
122+ )
123+ }
114124 }
115125 }
116- }
117126
118127#if os(macOS)
119128
120- var checkmark : some View {
121- return Text ( " ✓ " )
122- }
129+ var checkmark : some View {
130+ return Text ( " ✓ " )
131+ }
123132
124133#else
125134
126- var checkmark : some View {
127- return Image ( systemName: " checkmark " )
128- }
135+ var checkmark : some View {
136+ return Image ( systemName: " checkmark " )
137+ }
129138
130139#endif
131-
132- func valueSelected ( _ value : Value . WrappedFlagValue ? ) {
133- self . value . wrapped = value
134- showPicker = false
140+ func valueSelected ( _ value : Value . WrappedFlagValue ? ) {
141+ self . value . wrapped = value
142+ presentationMode . wrappedValue . dismiss ( )
143+ }
135144 }
136-
137145}
138146
139-
140147// MARK: - Creating CaseIterableFlagControls
141148
142149@available ( OSX 11 . 0 , iOS 13 . 0 , watchOS 7 . 0 , tvOS 13 . 0 , * )
143150protocol OptionalCaseIterableEditableFlag {
144- func control< RootGroup> ( label: String , manager: FlagValueManager < RootGroup > , showDetail: Binding < Bool > , showPicker : Binding < Bool > ) -> AnyView where RootGroup: FlagContainer
151+ func control< RootGroup> ( label: String , manager: FlagValueManager < RootGroup > , showDetail: Binding < Bool > ) -> AnyView where RootGroup: FlagContainer
145152}
146153
147154@available ( OSX 11 . 0 , iOS 13 . 0 , watchOS 7 . 0 , tvOS 13 . 0 , * )
@@ -150,7 +157,7 @@ extension UnfurledFlag: OptionalCaseIterableEditableFlag
150157 Value. WrappedFlagValue. AllCases: RandomAccessCollection , Value. WrappedFlagValue: RawRepresentable ,
151158 Value. WrappedFlagValue. RawValue: FlagValue , Value. WrappedFlagValue: Hashable
152159{
153- func control< RootGroup> ( label: String , manager: FlagValueManager < RootGroup > , showDetail: Binding < Bool > , showPicker : Binding < Bool > ) -> AnyView where RootGroup: FlagContainer {
160+ func control< RootGroup> ( label: String , manager: FlagValueManager < RootGroup > , showDetail: Binding < Bool > ) -> AnyView where RootGroup: FlagContainer {
154161 let key = info. key
155162
156163 return OptionalCaseIterableFlagControl < Value > (
@@ -159,7 +166,7 @@ extension UnfurledFlag: OptionalCaseIterableEditableFlag
159166 get: { Value ( manager. flagValue ( key: key) ) } ,
160167 set: { newValue in
161168 do {
162- try manager. setFlagValue ( newValue. wrapped , key: key)
169+ try manager. setFlagValue ( newValue, key: key)
163170
164171 } catch {
165172 print ( " [Vexilographer] Could not set flag with key \" \( key) \" to \" \( newValue) \" " )
@@ -168,8 +175,7 @@ extension UnfurledFlag: OptionalCaseIterableEditableFlag
168175 ) ,
169176 hasChanges: manager. hasValueInSource ( flag: flag) ,
170177 isEditable: manager. isEditable,
171- showDetail: showDetail,
172- showPicker: showPicker
178+ showDetail: showDetail
173179 )
174180 . eraseToAnyView ( )
175181 }
0 commit comments