передать идентификатор на другой экран для отображения конкретного id — продукта и его сведений

#ios #json #swift

#iOS #json #swift

Вопрос:

У меня есть одно представление коллекции, в котором должно отображаться только название категории и ее изображение. И я показываю название этой категории, изображение, выполняя некоторый вызов api. А также для каждого названия категории я получу идентификатор клиента для каждого названия категории. Вот полный код для этого

  func apicalling () {

        let headers = [
            "content-type": "application/json",
            "cache-control": "no-cache",
            "postman-token": "7adebcbe-18b4-d2a7-2159-2fbcaea27edd"
        ]
        let parameters = [
            "customerID": "1",
            "listType": "2"
        ]
        do {
            let postData = try JSONSerialization.data(withJSONObject: parameters, options :[])
            let request = NSMutableURLRequest(url: NSURL(string: "http://example/categoryname.php")! as URL,
                                              cachePolicy: .useProtocolCachePolicy,timeoutInterval: 10.0)
            request.httpMethod = "POST"
            request.allHTTPHeaderFields = headers
            request.httpBody = postData

            let session = URLSession.shared
            let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
                if (error != nil) {
                    ///print(error)
                } else {

                    DispatchQueue.main.async(execute: {

                        if let json = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? Dictionary<String,AnyObject>
                        {
                            let status = json["status"] as? Int;
                            if(status == 1)
                            {
                                //print("SUCCESS....")
                                if let typeValues = json["categories"] as? [NSDictionary]
                                {
                                    DispatchQueue.main.async(execute: {

                                       // print("INSIDE CATEGORIES")

                                        for item in typeValues
                                        {
                                           // print("INSIDE LISTING ITEMS...")

                                            self.BTdata.append(BTData(json:item))

                                        }

                                        //print(self.BTdata[0].BTNames)


                                         self.collectionView!.reloadData()

                                    })
                                }

                            }

                        }
                    })

                }
            })

            dataTask.resume()
        } catch {
            // print("JSON serialization failed:  (error)")
        }
    }

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
 {
       return BTdata.count
 }

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
 {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

         cell.CatName.text = BTdata[(indexPath as NSIndexPath).row].BTNames

        let imgURL: URL = URL(string: BTdata[(indexPath as NSIndexPath).row].BTImage!)!

        let request: URLRequest = URLRequest(url: imgURL)

        let session = URLSession.shared

        let task = session.dataTask(with: request, completionHandler: {
            (data, response, error) -> Void in

            if (error == nil amp;amp; data != nil)
            {
                func display_image()
                {
                    cell.ProductImg.image = UIImage(data:data!)
                }

              DispatchQueue.main.sync(execute: display_image)
            }
        })

        task.resume()

      return cell
  }

 func getIndexPathForSelectedCell() -> IndexPath?
 {
        var indexPath:IndexPath?

        if collectionView.indexPathsForSelectedItems!.count > 0 {
            indexPath = collectionView.indexPathsForSelectedItems![0]
        }
     return indexPath
 }

 override func prepare(for segue: UIStoryboardSegue, sender: Any?)
 {
        if segue.identifier == "showDetails"
        {
            if let indexPath = getIndexPathForSelectedCell()
            {
                let ContainerviewController = segue.destination as! DetailVC

                ContainerviewController.BTdata = [BTdata[(indexPath as NSIndexPath).row]]

                print("Printing value on collection click.....")

                print(BTdata[(indexPath as NSIndexPath).row].BTIds)

            }
        }
    }
  

Как вы можете видеть из моего приведенного выше кода, я выполнил переход к другому контроллеру представления. И я передаю ID другому контроллеру представления.В другом контроллере просмотра мне нужно отобразить элементы продукта, которые пользователь выбирает в моем первом контроллере просмотра.

В моем втором контроллере просмотра я создал некоторый api для отображения всего продукта.Таким образом, поток :

  1. Когда пользователь нажимает название любой категории в моем первом контроллере просмотра, он должен перейти ко второму контроллеру просмотра и должен указать конкретный продукт для выбранного названия категории. Вот код моего второго VC :

    Здесь я получаю идентификатор из моего первого vc, который пользователь нажал на название любой категории :

     override func viewDidLoad() {
    
         super.viewDidLoad()
    
        self.BTypeId = BTdata[0].BTIds
        Allproductapicalling ()
    }
    
    func Allproductapicalling () {
    
        let headers = [
            "content-type": "application/json",
            "cache-control": "no-cache",
            "postman-token": "c98d0000-637b-1efc-8f93-f9e277ffefcd"
        ]
        let parameters = [
            "customerID": "1",
            "listType": "1"
        ]
    
        do {
            let postData = try JSONSerialization.data(withJSONObject: parameters, options :[])
            let request = NSMutableURLRequest(url: NSURL(string: "http://exp.php")! as URL,
                                              cachePolicy: .useProtocolCachePolicy,timeoutInterval: 10.0)
            request.httpMethod = "POST"
            request.allHTTPHeaderFields = headers
            request.httpBody = postData
    
            let session = URLSession.shared
            let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
                if (error != nil) {
                    ///print(error)
                } else {
    
                    DispatchQueue.main.async(execute: {
    
                        if let json = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? Dictionary<String,AnyObject>
                        {
                            let status = json["status"] as? Int;
                            if(status == 1)
                            {
                                print("SUCCESS....")
    
                                if let typeValues = json["products"] as? [NSDictionary]
                                {
                                    DispatchQueue.main.async(execute: {
    
                                        print("INSIDE CATEGORIES")
    
                                         for item in typeValues {
    
                                            let bId = item.value(forKey: "categoryID") as! String
    
                                            if(bId == self.BTypeId) {
    
                                               self.Productdata.append(ProductData(json:item))
    
                                            }
                                        }
    
                                    })
    
                                    //print("Product Name : ", self.Productdata[0].proName)
                                }
    
                            }
    
                        }
                    })
    
                }
            })
    
            dataTask.resume()
    
    
    
        } catch {
            // print("JSON serialization failed:  (error)")
        }
    }
      

Моя проблема заключается в этой строке из приведенного выше кода вызова api :

 if let typeValues = json["products"] as? [NSDictionary]
{
        DispatchQueue.main.async(execute: {
                for item in typeValues {
                   let bId = item.value(forKey: "categoryID") as! String
                         if(bId == self.BTypeId) {
                                self.Productdata.append(ProductData(json:item))
                         }
                       }

                   })
  

я получаю идентификатор выбранной категории из моего первого VC и сравниваю с идентификатором категории, вызываемым api all product. И мне нужно отобразить только этот конкретный продукт.Как это сделать??

 if(bId == self.BTypeId)
  

Пожалуйста, помогите мне.

Спасибо

Комментарии:

1. пожалуйста, скажите мне, что self. BTypeId — это строка?

2. Да, только в этом случае я передаю идентификатор категории моего первого названия категории, выбранного vc

3. поставьте точку останова для этого условия и проверьте, совпадают ли оба значения или отличаются

4. мне понравилось это if(bId == self.BTypeId) { print("6 product are there.....") } . Я получил инструкцию print

5. Но когда я добавляю и вижу значения продукта. Я не получаю конкретный продукт для выбранной категории

Ответ №1:

  DispatchQueue.main.async(execute: {
   for item in typeValues {
       let bId = item.value(forKey: "categoryID") as! String
       if(bId as? String == self.BTypeId) {
               print("Hurray sathish......")
               self.Productdata.append(ProductData(json:item))

               // print(self.Productdata.append(bId))

        }
     }
     self.Collectionview.delegate = self
     self.Collectionview.dataSource = self
     self.Collectionview.reloadData()
 })

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
 {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! DetailCollectionviewcell

        cell.DetailProductName.text = Productdata[indexPath.row].proDescription

        let imgURL: URL = URL(string: Productdata[indexPath.row].proImage!)!

        let request: URLRequest = URLRequest(url: imgURL)

        let session = URLSession.shared

        let task = session.dataTask(with: request, completionHandler: {
            (data, response, error) -> Void in

            if (error == nil amp;amp; data != nil)
            {
                func display_image()
                {
                    cell.DetailImage.image = UIImage(data:data!)
                }


                DispatchQueue.main.sync(execute: display_image)
            }
        })

        task.resume()


        return cell
    }
  

Ваш вывод :

Ваша проблема решена, одобряю ответ и отказываюсь от голосования, спасибо. Удачного кодирования.