I have three textFields one for keys and one for values of the key and the other for id of the value I want if I choose ex: "Color" key in key textField then show in value textField : red and white .... and when I pick white in value textField then show id of this value in id textField and so on with food Key using pickerView
this is my response :
"properties": [
{
"Color": [
{
"id": "2b47d72a-6d9a-4a5c-b1b5-858c85033a46",
"value": "Red"
},
{
"id": "0597b98d-f414-42f1-94cc-b9f9456868d6",
"value": "White"
}
]
},
{
"Food": [
{
"id": "5b6f1094-31aa-4597-8e19-dddb69d20e08",
"value": "Cheat Meal"
},
{
"id": "d670b3c6-6b04-489b-8807-f7c69d85b7a7",
"value": "Chicken Brost"
}
]
}
]
Stucts
import Foundation
struct ListCategoriesData : Codable {
let statusCode : Int
let message : String
let data : CategoriesListData
enum CodingKeys: String, CodingKey {
case statusCode = "statusCode"
case message = "message"
case data
}
}
import Foundation
struct CategoriesListData : Codable {
let id : String
let rootUserId : Int
let profileId : Int
let name : String
let unit : String
let tags : [String]
let media : String
let createdAt : String
let updatedAt : String
let properties : [[String: [PropertiesValues] ]]
enum CodingKeys: String, CodingKey {
case id = "id"
case rootUserId = "rootUserId"
case profileId = "profileId"
case name = "name"
case unit = "unit"
case tags
case media = "media"
case createdAt = "createdAt"
case updatedAt = "updatedAt"
case properties
}
}
import Foundation
struct PropertiesValues : Codable {
let id : String
let value: String
}
Fetching keys Request
class func requestKeysList(completionHandler: @escaping ([String], Error?) -> Void) {
var request = URLRequest(url: EndPoints.getKeys.url)
request.addValue("eyJhbGciKQ", forHTTPHeaderField: "x-auth-token")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else {
completionHandler([], error)
return
}
let decoder = JSONDecoder()
do {
let keysResponse = try decoder.decode(ListCategoriesData.self, from: data)
print(keysResponse)
let keys = keysResponse.data.properties.flatMap({$0.keys})
print(keys)
completionHandler(keys, nil)
} catch {
DispatchQueue.main.async {
completionHandler([], error)
}
}
}
task.resume()
}
fetching value request
class func requestValuesList(completionHandler: @escaping ([PropertiesValues], Error?) -> Void) {
var request = URLRequest(url: EndPoints.getKeys.url)
request.addValue("eyJhbGciKQ", forHTTPHeaderField: "x-auth-token")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else {
completionHandler([], error)
return
}
let decoder = JSONDecoder()
do {
let keysResponse = try decoder.decode(ListCategoriesData.self, from: data)
print(keysResponse)
let keys = keysResponse.data.properties.flatMap({$0.values.flatMap({$0})})
print(keys)
completionHandler(keys, nil)
} catch {
DispatchQueue.main.async {
completionHandler([], error)
}
}
}
task.resume()
}
fetching ids of the value request
class func requestCategoryIdList(completionHandler: @escaping ([PropertiesValues], Error?) -> Void) {
var request = URLRequest(url: EndPoints.getKeys.url)
request.addValue("eyJhbGciKQ", forHTTPHeaderField: "x-auth-token")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else {
completionHandler([], error)
return
}
let decoder = JSONDecoder()
do {
let keysResponse = try decoder.decode(ListCategoriesData.self, from: data)
print(keysResponse)
let keys = keysResponse.data.properties.flatMap({$0.values.flatMap({$0})})
print(keys)
completionHandler(keys, nil)
} catch {
DispatchQueue.main.async {
completionHandler([], error)
}
}
}
task.resume()
}
controller's requests to retrieve keys and values
func getAllKeys() {
ApiManager.requestKeysList { (keys:[String], error: Error?) in
// keys var which has [String]
ListKeysModel.keys = keys
print(ListKeysModel.keys)
DispatchQueue.main.async {
self.pickerView.reloadAllComponents()
}
}
}
func getAllValues() {
ApiManager.requestValuesList { (values:[PropertiesValues], error: Error?) in
// value var which has [PropertiesValues]
ListKeysModel.values = values
print(ListKeysModel.values)
DispatchQueue.main.async {
self.pickerView.reloadAllComponents()
}
}
}
PickerView Usage
extension ProductProperties :UIPickerViewDelegate,UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
switch pickerView.tag {
case 1:
return ListKeysModel.keys.count
case 2:
return ListKeysModel.values.count
case 3:
return ListKeysModel.id.count
default:
return 1
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
switch pickerView.tag {
case 1:
return ListKeysModel.keys[row]
case 2:
return "\(ListKeysModel.values[row].value)"
case 3:
return "\(ListKeysModel.id[row].id)"
default:
return "Data Not Fount"
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch pickerView.tag {
case 1:
propertyTextField.text = ListKeysModel.keys[row]
propertyTextField.resignFirstResponder()
case 2:
valueTextFiedl.text = "\(ListKeysModel.values[row].value)"
valueTextFiedl.resignFirstResponder()
case 3:
idLabel.text = "\(ListKeysModel.id[row].id)"
default:
return
}
}
}
## the problem here there is no validation I got all values even I picked a specific value ex: I got red , white , cheat meal , chicken brost not red and white or cheat meal and chicken brost and the same I got all ids in id textField not only the id of the value I picked I will be so happy if anyone helped me ##