Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions DevLog/Resource/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -251,9 +251,6 @@
},
"검색어를 입력해 저장한 앱 컨텐츠를 찾아보세요." : {

},
"검색어를 입력해주세요." : {

},
"계정 삭제" : {

Expand Down
92 changes: 46 additions & 46 deletions DevLog/UI/Home/TodoListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -74,11 +92,13 @@ struct TodoListView: View {
if #available(iOS 26.0, *) {
ToolbarSpacer(.fixed, placement: .topBarTrailing)
}
Comment on lines 92 to 94
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

if #available(iOS 26.0, *) 구문은 오타인 것 같습니다. ToolbarSpacer는 iOS 16.0부터 사용 가능하므로 iOS 16.0으로 수정해야 합니다. 현재 코드는 의도한 대로 동작하지 않을 수 있습니다.

            if #available(iOS 16.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")
}
}
}
Comment on lines +95 to 103
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

iOS 18 미만 버전에서는 검색 버튼(돋보기 아이콘)이 사라지고, 목록을 아래로 당겨야만 검색창이 나타나도록 변경되었습니다. 이는 기존에 버튼을 통해 검색을 시작하던 방식과 달라진 사용자 경험을 제공합니다. iOS 17의 툴바 버그를 해결하기 위한 의도적인 디자인 변경인지, 아니면 수정 과정에서 발생한 부수적인 효과인지 확인이 필요해 보입니다. 만약 의도하지 않은 변경이라면, iOS 17에서도 검색 버튼을 유지하면서 버그를 해결할 수 있는 다른 방법을 고려해볼 수 있습니다.

}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
40 changes: 13 additions & 27 deletions DevLog/UI/Search/SearchView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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: "검색"
)
Comment on lines +80 to +91
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

searchable 수정자에서 isPresentedplacement 파라미터를 함께 사용하는 오버로드는 iOS 17.0부터 사용 가능합니다. #available(iOS 17.0, *) 확인 로직이 제거되어, 앱의 최소 지원 버전이 iOS 17.0 미만일 경우 컴파일 오류가 발생할 수 있습니다. 다른 파일에서 iOS 16.0을 지원하는 것으로 보이는 코드가 있어, 이 부분을 다시 확인하고 버전 분기 처리를 추가하는 것을 권장합니다.

.onSubmit(of: .search) {
viewModel.send(.addRecentQuery(viewModel.state.searchQuery))
}
Expand Down