validation from response using pickerView (swift)

Viewed 107

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  ##

0 Answers
Related