From 1c4149e8915c33dfb535b4cc568dceb75d52fdec Mon Sep 17 00:00:00 2001 From: opficdev Date: Wed, 4 Mar 2026 10:15:25 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20ios=2017=EA=B8=B0=EB=B0=98=EC=9D=B4?= =?UTF-8?q?=EB=AF=80=EB=A1=9C=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EB=B3=84=20=EB=B6=84=EA=B8=B0=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevLog/UI/Home/TodoListView.swift | 45 +++++++++---------------------- DevLog/UI/Search/SearchView.swift | 40 +++++++++------------------ 2 files changed, 26 insertions(+), 59 deletions(-) diff --git a/DevLog/UI/Home/TodoListView.swift b/DevLog/UI/Home/TodoListView.swift index 4bb71357..37c3e428 100644 --- a/DevLog/UI/Home/TodoListView.swift +++ b/DevLog/UI/Home/TodoListView.swift @@ -154,22 +154,13 @@ struct TodoListView: View { @ViewBuilder 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)) } - ) - let searchResults = viewModel.state.searchResults let limit = viewModel.searchResultsLimit let displayedTodos = viewModel.state.showAllSearchResults ? searchResults : Array(searchResults.prefix(limit)) - let content = ScrollView { + ScrollView { LazyVStack(spacing: 0) { if viewModel.state.searchText.isEmpty { Text("검색어를 입력해주세요.") @@ -209,28 +200,18 @@ 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)) - } - } + .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 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)) } From 2bc7b3d414fcd12a54f820f4cc4ef86118610f09 Mon Sep 17 00:00:00 2001 From: opficdev Date: Wed, 4 Mar 2026 14:22:29 +0900 Subject: [PATCH 2/2] =?UTF-8?q?ui:=20iOS=2017=EC=9D=80=20=EC=83=81?= =?UTF-8?q?=EC=8B=9C=20=EC=84=9C=EC=B9=98=EB=B0=94=EA=B0=80=20=EB=96=A0?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevLog/Resource/Localizable.xcstrings | 3 -- DevLog/UI/Home/TodoListView.swift | 75 +++++++++++++++++---------- 2 files changed, 47 insertions(+), 31 deletions(-) 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 37c3e428..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,22 +172,33 @@ struct TodoListView: View { } } - @ViewBuilder + @available(iOS 18, *) private var todoSearchContent: some View { + 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)) - 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 { @@ -200,18 +231,6 @@ struct TodoListView: View { } } } - .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 headerView: some View {