我正在嘗試根據搜索查詢從 API 獲取 url。如果我將查詢引數硬編碼為 url 中的某個值(即“fitness”),我會得到回應。
如果我將查詢引數設定為稍后插入的內插值,則應用程式在運行時沒有影像——這是有道理的。
但是,當我在搜索欄中輸入搜索查詢時,我也無法獲取結果。事實上,我的結果是 0。
這是錯誤:
po jsonResult
? APIResponse
- total : 0
- results : 0 elements
這是我的代碼:
楷模
import Foundation
struct APIResponse: Codable {
let total: Int
let results: [Result]
}
struct Result: Codable {
let id: String
let urls: URLS
}
struct URLS: Codable {
let full: String
}
看法
import SwiftUI
struct SimpleView: View {
@ObservedObject var simpleViewModel = SimpleViewModel.shared
@State private var searchText = ""
@State private var selected: String? = nil
var filteredResults: [Result] {
if searchText.isEmpty {
return simpleViewModel.results
} else {
return simpleViewModel.results.filter { $0.urls.full.contains(searchText) }
}
}
var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 0) {
ForEach(filteredResults, id: \.id) { result in
NavigationLink(destination: SimpleDetailView()) {
VStack {
AsyncImage(url: URL(string: result.urls.full)) { image in
image.resizable()
} placeholder: {
ProgressView()
}
.scaledToFill()
.frame(maxWidth: .infinity)
.onTapGesture {
withAnimation(.spring()) {
if self.selected == result.urls.full {
self.selected = nil
} else {
self.selected = result.urls.full
}
}
hideKeyboard()
}
.scaleEffect(self.selected == result.urls.full ? 3.0 : 1.0)
}
}
}
}
}
.onAppear {
simpleViewModel.fetchPhotos(query: searchText)
}
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
}
}
}
struct SimpleView_Previews: PreviewProvider {
static var previews: some View {
SimpleView()
}
}
視圖模型
import Foundation
class SimpleViewModel: ObservableObject {
static let shared = SimpleViewModel()
private init() {}
@Published var results = [Result]()
func fetchPhotos(query: String) {
let url = "https://api.unsplash.com/search/photos?page=1&query=\(query)&client_id=blahblahblahblahblahblahblahblah"
guard let url = URL(string: url) else { return }
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
guard let data = data, error == nil else { return }
do {
let jsonResult = try JSONDecoder().decode(APIResponse.self, from: data)
DispatchQueue.main.async {
self?.results = jsonResult.results
}
} catch {
print("Error: \(error)")
}
}
task.resume()
}
}
如何根據 SimpleViewModel 中的搜索查詢在 SimpleView 中搜索影像?
- 設定斷點(我如何發現 0 值)
- 三元運算子檢查搜索值與否
- 讓我的電腦著火
更新
我按照@workingdog 的建議將此添加到代碼中,但帶有else宣告。
.onSubmit(of: .search) {
if searchText.isEmpty {
simpleViewModel.results = filteredResults
} else if !searchText.isEmpty {
simpleViewModel.fetchPhotos(query: searchText)
}
}
這是發生的事情:
- 已獲取影像,但未顯示在視圖中
- 提交時的搜索查詢不呈現任何內容
- 按取消執行查詢
- 影像顯示
- 影像保留并顯示。回到 2。
uj5u.com熱心網友回復:
在您SimpleView的 中,僅在視圖出現時.onAppear { simpleViewModel.fetchPhotos(query: searchText }呼叫,并使用. 換句話說,您有一個空查詢。所以洗掉,它什么都不做。searchText = "".onAppear{...}
添加類似這樣的內容,以在searchText
提交時獲取照片。
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
.onSubmit(of: .search) {
if !searchText.isEmpty {
simpleViewModel.fetchPhotos(query: searchText)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529562.html
