@@ -15,10 +15,28 @@ struct TodoListView: View {
1515
1616 var body : some View {
1717 Group {
18- if viewModel. state. isSearching {
19- todoSearchContent
18+ if #available( iOS 18 , * ) {
19+ if viewModel. state. isSearching {
20+ todoSearchContent
21+ } else {
22+ todoListContent
23+ }
2024 } else {
21- todoListContent
25+ Group {
26+ if viewModel. state. searchText. isEmpty {
27+ todoListContent
28+ } else {
29+ searchResultsContent
30+ }
31+ }
32+ . searchable (
33+ text: Binding (
34+ get: { viewModel. state. searchText } ,
35+ set: { viewModel. send ( . setSearchText( $0) ) }
36+ ) ,
37+ placement: . navigationBarDrawer( displayMode: . always) ,
38+ prompt: " \( viewModel. state. kind. localizedName) 검색 "
39+ )
2240 }
2341 }
2442 . navigationDestination ( for: Path . self) { path in
@@ -74,11 +92,13 @@ struct TodoListView: View {
7492 if #available( iOS 26 . 0 , * ) {
7593 ToolbarSpacer ( . fixed, placement: . topBarTrailing)
7694 }
77- ToolbarItem ( placement: . topBarTrailing) {
78- Button {
79- viewModel. send ( . setIsSearching( true ) )
80- } label: {
81- Image ( systemName: " magnifyingglass " )
95+ if #available( iOS 18 , * ) {
96+ ToolbarItem ( placement: . topBarTrailing) {
97+ Button {
98+ viewModel. send ( . setIsSearching( true ) )
99+ } label: {
100+ Image ( systemName: " magnifyingglass " )
101+ }
82102 }
83103 }
84104 }
@@ -152,31 +172,33 @@ struct TodoListView: View {
152172 }
153173 }
154174
155- @ViewBuilder
175+ @available ( iOS 18 , * )
156176 private var todoSearchContent : some View {
157- let searchTextBinding = Binding (
158- get: { viewModel. state. searchText } ,
159- set: { viewModel. send ( . setSearchText( $0) ) }
160- )
161- let isSearchingBinding = Binding (
162- get: { viewModel. state. isSearching } ,
163- set: { viewModel. send ( . setIsSearching( $0) ) }
164- )
177+ searchResultsContent
178+ . searchable (
179+ text: Binding (
180+ get: { viewModel. state. searchText } ,
181+ set: { viewModel. send ( . setSearchText( $0) ) }
182+ ) ,
183+ isPresented: Binding (
184+ get: { viewModel. state. isSearching } ,
185+ set: { viewModel. send ( . setIsSearching( $0) ) }
186+ ) ,
187+ placement: . navigationBarDrawer( displayMode: . always) ,
188+ prompt: " \( viewModel. state. kind. localizedName) 검색 "
189+ )
190+ }
165191
192+ private var searchResultsContent : some View {
166193 let searchResults = viewModel. state. searchResults
167194 let limit = viewModel. searchResultsLimit
168195 let displayedTodos = viewModel. state. showAllSearchResults
169196 ? searchResults
170197 : Array ( searchResults. prefix ( limit) )
171198
172- let content = ScrollView {
199+ return ScrollView {
173200 LazyVStack ( spacing: 0 ) {
174- if viewModel. state. searchText. isEmpty {
175- Text ( " 검색어를 입력해주세요. " )
176- . foregroundStyle ( Color . gray)
177- . frame ( maxWidth: . infinity)
178- . padding ( . top, 40 )
179- } else if viewModel. state. isLoading {
201+ if viewModel. state. isLoading {
180202 LoadingView ( )
181203 . padding ( . top, 40 )
182204 } else if searchResults. isEmpty {
@@ -209,28 +231,6 @@ struct TodoListView: View {
209231 }
210232 }
211233 }
212-
213- Group {
214- if #available( iOS 17 . 0 , * ) {
215- content. searchable (
216- text: searchTextBinding,
217- isPresented: isSearchingBinding,
218- placement: . navigationBarDrawer( displayMode: . always) ,
219- prompt: " \( viewModel. state. kind. localizedName) 검색 "
220- )
221- } else {
222- content. searchable (
223- text: searchTextBinding,
224- placement: . navigationBarDrawer( displayMode: . always) ,
225- prompt: " \( viewModel. state. kind. localizedName) 검색 "
226- )
227- }
228- }
229- . onAppear {
230- DispatchQueue . main. async {
231- viewModel. send ( . setIsSearching( true ) )
232- }
233- }
234234 }
235235
236236 private var headerView : some View {
0 commit comments