我正在嘗試實作兩個并排的 UIPickerViews,一個用于 Type,另一個用于 Subtype。每個都是字串陣列
var typePickerData: [String] = [String]()
var subtypePickerData: [String] = [String]()
每個都是一個非常簡單的名稱陣列:
typePickerData = ["Monitor","Keyboard","Mouse"]
當 viewDidLoad 觸發或選擇了新型別時,應用程式會進行遠程資料庫呼叫,我會收到一個包含子型別名稱 JSON 的回應,我想用它來填充和重新加載子型別選擇器。
我堅持將回應轉換為 subtypePickerData
let decoder = JSONDecoder()
if let jsonResponse = try? decoder.decode([String].self, from: data) {
print("parse subtype response \(jsonResponse)")
subtypePickerData = jsonResponse
DispatchQueue.main.async {
self.subtypePicker.reloadAllComponents()
}
}
我在這里將 JSON 回應轉換為 subtypePickerData 做錯了什么?
這就是我從遠程呼叫中得到的
result Optional(<__NSArrayM 0x281370e70>( { name = Monitor; },{ name = "AV Accessories"; },{ name = Computer; },{ name = "Monitor Stands"; },{ name = "Bracket/Mount"; },{ name = Screen; }
這是解決問題后我更新的代碼
let decoder = JSONDecoder()
if let jsonResponse = try? decoder.decode(Subtypes.self, from: data) {
SubtypeList = jsonResponse.result
self.subtypePickerData = SubtypeList.map{$0.Name}
DispatchQueue.main.async {
self.subtypePicker.reloadAllComponents()
}
}
uj5u.com熱心網友回復:
您的回應似乎不是型別,[String]而是一組自定義物件。您首先需要創建一個結構來解碼您的回應資料。
struct NameContainer{
var name: String
}
然后做:
//change decoding to String array to decoding array of custom object NameContainer
if let jsonResponse = try? decoder.decode([NameContainer].self, from: data) {
print("parse subtype response \(jsonResponse)")
subtypePickerData = jsonResponse.map{$0.name} // Map your objects to strings and assign them
DispatchQueue.main.async {
self.subtypePicker.reloadAllComponents()
}
}
評論:
- 永遠不要使用
try?它會混淆所有錯誤。使用適當的 do/catch 塊,處理錯誤或標記您的函式throws并處理鏈上的錯誤。
uj5u.com熱心網友回復:
DispatchQueue.main.async {
self.subtypePicker.reloadAllComponents()
Bracket/Mount"; },{ name = Screen; } –
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490928.html
