Skip to content

Commit 72525b8

Browse files
authored
[#179] iOS 17의 TodoListView의 searchable이 포커싱 될 때 툴바가 보이는 현상을 해결한다 (#180)
* refactor: 프로젝트가 ios 17기반이므로 불필요한 버전 별 분기 제거 * ui: iOS 17은 상시 서치바가 떠있도록 변경
1 parent c7bb349 commit 72525b8

3 files changed

Lines changed: 59 additions & 76 deletions

File tree

DevLog/Resource/Localizable.xcstrings

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,6 @@
251251
},
252252
"검색어를 입력해 저장한 앱 컨텐츠를 찾아보세요." : {
253253

254-
},
255-
"검색어를 입력해주세요." : {
256-
257254
},
258255
"계정 삭제" : {
259256

DevLog/UI/Home/TodoListView.swift

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

DevLog/UI/Search/SearchView.swift

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,7 @@ struct SearchView: View {
5959

6060
@ViewBuilder
6161
private var searchableContent: some View {
62-
let searchQueryBinding = Binding(
63-
get: { viewModel.state.searchQuery },
64-
set: { viewModel.send(.setSearchQuery($0)) }
65-
)
66-
let searchingBinding = Binding(
67-
get: { viewModel.state.isSearching },
68-
set: { viewModel.send(.setSearching($0)) }
69-
)
70-
71-
let scrollContent = ScrollView {
62+
ScrollView {
7263
LazyVStack(alignment: .leading, spacing: 0) {
7364
if viewModel.state.isLoading {
7465
LoadingView()
@@ -86,23 +77,18 @@ struct SearchView: View {
8677
}
8778
.frame(maxWidth: .infinity, alignment: .leading)
8879
}
89-
90-
Group {
91-
if #available(iOS 17.0, *) {
92-
scrollContent.searchable(
93-
text: searchQueryBinding,
94-
isPresented: searchingBinding,
95-
placement: .navigationBarDrawer(displayMode: .always),
96-
prompt: "검색"
97-
)
98-
} else {
99-
scrollContent.searchable(
100-
text: searchQueryBinding,
101-
placement: .navigationBarDrawer(displayMode: .always),
102-
prompt: "검색"
103-
)
104-
}
105-
}
80+
.searchable(
81+
text: Binding(
82+
get: { viewModel.state.searchQuery },
83+
set: { viewModel.send(.setSearchQuery($0)) }
84+
),
85+
isPresented: Binding(
86+
get: { viewModel.state.isSearching },
87+
set: { viewModel.send(.setSearching($0)) }
88+
),
89+
placement: .navigationBarDrawer(displayMode: .always),
90+
prompt: "검색"
91+
)
10692
.onSubmit(of: .search) {
10793
viewModel.send(.addRecentQuery(viewModel.state.searchQuery))
10894
}

0 commit comments

Comments
 (0)