diff --git a/DevLog/Resource/Localizable.xcstrings b/DevLog/Resource/Localizable.xcstrings index 58437a2e..252bb80d 100644 --- a/DevLog/Resource/Localizable.xcstrings +++ b/DevLog/Resource/Localizable.xcstrings @@ -251,9 +251,6 @@ }, "검색어를 입력해 저장한 앱 컨텐츠를 찾아보세요." : { - }, - "검색어를 입력해주세요." : { - }, "계정 삭제" : { diff --git a/DevLog/UI/Home/TodoListView.swift b/DevLog/UI/Home/TodoListView.swift index 4bb71357..152e82b1 100644 --- a/DevLog/UI/Home/TodoListView.swift +++ b/DevLog/UI/Home/TodoListView.swift @@ -15,10 +15,28 @@ struct TodoListView: View { var body: some View { Group { - if viewModel.state.isSearching { - todoSearchContent + if #available(iOS 18, *) { + if viewModel.state.isSearching { + todoSearchContent + } else { + todoListContent + } } else { - todoListContent + Group { + if viewModel.state.searchText.isEmpty { + todoListContent + } else { + searchResultsContent + } + } + .searchable( + text: Binding( + get: { viewModel.state.searchText }, + set: { viewModel.send(.setSearchText($0)) } + ), + placement: .navigationBarDrawer(displayMode: .always), + prompt: "\(viewModel.state.kind.localizedName) 검색" + ) } } .navigationDestination(for: Path.self) { path in @@ -74,11 +92,13 @@ struct TodoListView: View { if #available(iOS 26.0, *) { ToolbarSpacer(.fixed, placement: .topBarTrailing) } - ToolbarItem(placement: .topBarTrailing) { - Button { - viewModel.send(.setIsSearching(true)) - } label: { - Image(systemName: "magnifyingglass") + if #available(iOS 18, *) { + ToolbarItem(placement: .topBarTrailing) { + Button { + viewModel.send(.setIsSearching(true)) + } label: { + Image(systemName: "magnifyingglass") + } } } } @@ -152,31 +172,33 @@ struct TodoListView: View { } } - @ViewBuilder + @available(iOS 18, *) private var todoSearchContent: some View { - let searchTextBinding = Binding( - get: { viewModel.state.searchText }, - set: { viewModel.send(.setSearchText($0)) } - ) - let isSearchingBinding = Binding( - get: { viewModel.state.isSearching }, - set: { viewModel.send(.setIsSearching($0)) } - ) + searchResultsContent + .searchable( + text: Binding( + get: { viewModel.state.searchText }, + set: { viewModel.send(.setSearchText($0)) } + ), + isPresented: Binding( + get: { viewModel.state.isSearching }, + set: { viewModel.send(.setIsSearching($0)) } + ), + placement: .navigationBarDrawer(displayMode: .always), + prompt: "\(viewModel.state.kind.localizedName) 검색" + ) + } + private var searchResultsContent: some View { let searchResults = viewModel.state.searchResults let limit = viewModel.searchResultsLimit let displayedTodos = viewModel.state.showAllSearchResults ? searchResults : Array(searchResults.prefix(limit)) - let content = ScrollView { + return ScrollView { LazyVStack(spacing: 0) { - if viewModel.state.searchText.isEmpty { - Text("검색어를 입력해주세요.") - .foregroundStyle(Color.gray) - .frame(maxWidth: .infinity) - .padding(.top, 40) - } else if viewModel.state.isLoading { + if viewModel.state.isLoading { LoadingView() .padding(.top, 40) } else if searchResults.isEmpty { @@ -209,28 +231,6 @@ struct TodoListView: View { } } } - - Group { - if #available(iOS 17.0, *) { - content.searchable( - text: searchTextBinding, - isPresented: isSearchingBinding, - placement: .navigationBarDrawer(displayMode: .always), - prompt: "\(viewModel.state.kind.localizedName) 검색" - ) - } else { - content.searchable( - text: searchTextBinding, - placement: .navigationBarDrawer(displayMode: .always), - prompt: "\(viewModel.state.kind.localizedName) 검색" - ) - } - } - .onAppear { - DispatchQueue.main.async { - viewModel.send(.setIsSearching(true)) - } - } } private var headerView: some View { diff --git a/DevLog/UI/Search/SearchView.swift b/DevLog/UI/Search/SearchView.swift index 52acc452..9e23a2ba 100644 --- a/DevLog/UI/Search/SearchView.swift +++ b/DevLog/UI/Search/SearchView.swift @@ -59,16 +59,7 @@ struct SearchView: View { @ViewBuilder private var searchableContent: some View { - let searchQueryBinding = Binding( - get: { viewModel.state.searchQuery }, - set: { viewModel.send(.setSearchQuery($0)) } - ) - let searchingBinding = Binding( - get: { viewModel.state.isSearching }, - set: { viewModel.send(.setSearching($0)) } - ) - - let scrollContent = ScrollView { + ScrollView { LazyVStack(alignment: .leading, spacing: 0) { if viewModel.state.isLoading { LoadingView() @@ -86,23 +77,18 @@ struct SearchView: View { } .frame(maxWidth: .infinity, alignment: .leading) } - - Group { - if #available(iOS 17.0, *) { - scrollContent.searchable( - text: searchQueryBinding, - isPresented: searchingBinding, - placement: .navigationBarDrawer(displayMode: .always), - prompt: "검색" - ) - } else { - scrollContent.searchable( - text: searchQueryBinding, - placement: .navigationBarDrawer(displayMode: .always), - prompt: "검색" - ) - } - } + .searchable( + text: Binding( + get: { viewModel.state.searchQuery }, + set: { viewModel.send(.setSearchQuery($0)) } + ), + isPresented: Binding( + get: { viewModel.state.isSearching }, + set: { viewModel.send(.setSearching($0)) } + ), + placement: .navigationBarDrawer(displayMode: .always), + prompt: "검색" + ) .onSubmit(of: .search) { viewModel.send(.addRecentQuery(viewModel.state.searchQuery)) }