我是 SwiftUI 的新手,正在開發并嘗試制作藥物搜索應用程式我正在制作搜索文本欄位,該欄位顯示藥物名稱建議串列
這是資料陣列和結構內的文本欄位。
@State var drugNameSearch = [DrugNameSearch]()
TextField("Insert Drug Name" , text: $drugName, onEditingChanged: { isEdited in
self.isEdited = isEdited
self.isDrugSearched = isEdited
})
.frame(height:geometry.size.height/35)
.onChange(of: drugName, perform: { value in
self.fetchData()
})
if isDrugSearched == true {
ForEach(drugNameSearch.filter({drugName.isEmpty ? false : $0.name.contains(drugName) }), id: \.self) { item in
HStack{
HStack{
Image(systemName: "magnifyingglass")
Text(item.name)
}
.onTapGesture{self.drugName = item.name}
Spacer()
}
}
}
else{}
以下是有問題的方法。如果沒有“&item_name=(drugName)”,應用程式可以正常啟動,但只能獲取有限的資料。使用下面的代碼,應用程式會因 URL 解包問題而崩潰。請給我建議...
private func fetchData() {
print("Drug Name Search Attempted!")
let url = URL(string: "http://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService/getDrugPrdtPrmsnDtlInq?serviceKey=SERVICEKEY&item_name=\(drugName)&numOfRows=10&type=json")
URLSession.shared.dataTask(with: url!){(data, response, error) in
do {
if let drugNameData = data {
let decodedData = try JSONDecoder().decode(DrugFetch.self, from: drugNameData)
DispatchQueue.main.async {
self.drugNameSearch = decodedData.body.items
}
} else {
print("No Data for drugNameSearch")
}
}
catch {
print("drugNameSearch Fetching Error: \(error)")
}
}//URLSession
.resume()
}
uj5u.com熱心網友回復:
您需要對 URL 查詢字串進行編碼,因為并非所有字符都允許在 URL 中使用。您可以通過呼叫addingPercentEncoding查詢來做到這一點String。
let baseUrl = "http://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService/getDrugPrdtPrmsnDtlInq"
let urlQuery = "?serviceKey=SERVICEKEY&item_name=\(drugName)&numOfRows=10&type=json"
guard let sanitisedUrl = urlQuery.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: baseUrl urlQuery) else { return }
或者,您可以使用URLComponents并將查詢設定為query屬性,這將String自動清理。
guard var urlComponents = URLComponents(string: "http://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService/getDrugPrdtPrmsnDtlInq") else { return }
urlComponents.query = "serviceKey=SERVICEKEY&item_name=\(drugName)&numOfRows=10&type=json"
guard let url = urlComponents.url else { return }
uj5u.com熱心網友回復:
嘗試在你的 dataTask 之前添加一個警衛
let url = "http://apis.data.go.kr/1471000/DrugPrdtPrmsnInfoService/getDrugPrdtPrmsnDtlInq?serviceKey=SERVICEKEY&item_name=\(drugName)&numOfRows=10&type=json"
guard let url = URL(string: urlString)?.absoluteURL else {
return // a custom error, like NetworkError.badURL
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406437.html
標籤:
