Initial Create
基础框架实现
This commit is contained in:
98
Jetson Media/ui/SearchView.swift
Normal file
98
Jetson Media/ui/SearchView.swift
Normal file
@@ -0,0 +1,98 @@
|
||||
import SwiftUI
|
||||
|
||||
struct SearchView: View {
|
||||
@State private var searchQuery: String = ""
|
||||
@State private var searchResults: [AlbumItem] = []
|
||||
@State private var isSearching: Bool = false
|
||||
@State private var showAlert: Bool = false
|
||||
@State private var alertMessage: String = ""
|
||||
|
||||
var body: some View {
|
||||
Form {
|
||||
Section(header: Text("搜索")) {
|
||||
HStack {
|
||||
TextField("输入搜索内容", text: $searchQuery)
|
||||
.textFieldStyle(RoundedBorderTextFieldStyle())
|
||||
|
||||
Button(action: performSearch) {
|
||||
if isSearching {
|
||||
ProgressView()
|
||||
} else {
|
||||
Image(systemName: "magnifyingglass")
|
||||
}
|
||||
}
|
||||
.disabled(searchQuery.isEmpty || isSearching)
|
||||
}
|
||||
}
|
||||
|
||||
if !searchResults.isEmpty {
|
||||
Section(header: Text("搜索结果")) {
|
||||
ForEach(searchResults, id: \.album_id) { item in
|
||||
NavigationLink(destination: PhotoView(albumId: item.album_id)) {
|
||||
VStack(alignment: .leading) {
|
||||
Text(item.title)
|
||||
.font(.headline)
|
||||
Text("ID: \(item.album_id)")
|
||||
.font(.subheadline)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.alert(isPresented: $showAlert) {
|
||||
Alert(title: Text("提示"), message: Text(alertMessage), dismissButton: .default(Text("确定")))
|
||||
}
|
||||
}
|
||||
|
||||
private func performSearch() {
|
||||
guard !searchQuery.isEmpty else { return }
|
||||
|
||||
isSearching = true
|
||||
searchResults = []
|
||||
|
||||
let encodedQuery = searchQuery.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? searchQuery
|
||||
let urlString = "https://jms.godserver.cn/search/?search_query=\(encodedQuery)&page=1"
|
||||
|
||||
guard let url = URL(string: urlString) else {
|
||||
showAlert(message: "无效的URL")
|
||||
isSearching = false
|
||||
return
|
||||
}
|
||||
|
||||
let task = URLSession.shared.dataTask(with: url) { data, response, error in
|
||||
DispatchQueue.main.async {
|
||||
self.isSearching = false
|
||||
|
||||
if let error = error {
|
||||
self.showAlert(message: "搜索失败: \(error.localizedDescription)")
|
||||
return
|
||||
}
|
||||
|
||||
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
|
||||
self.showAlert(message: "服务器返回错误")
|
||||
return
|
||||
}
|
||||
|
||||
guard let data = data else {
|
||||
self.showAlert(message: "没有接收到数据")
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
let decoder = JSONDecoder()
|
||||
self.searchResults = try decoder.decode([AlbumItem].self, from: data)
|
||||
} catch {
|
||||
print("解码错误: \(error)")
|
||||
self.showAlert(message: "解析数据失败: \(error.localizedDescription)")
|
||||
}
|
||||
}
|
||||
}
|
||||
task.resume()
|
||||
}
|
||||
private func showAlert(message: String) {
|
||||
alertMessage = message
|
||||
showAlert = true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user