#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 для отображения всего продукта.Таким образом, поток :
-
Когда пользователь нажимает название любой категории в моем первом контроллере просмотра, он должен перейти ко второму контроллеру просмотра и должен указать конкретный продукт для выбранного названия категории. Вот код моего второго 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.....") }
. Я получил инструкцию print5. Но когда я добавляю и вижу значения продукта. Я не получаю конкретный продукт для выбранной категории
Ответ №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
}
Ваш вывод :
Ваша проблема решена, одобряю ответ и отказываюсь от голосования, спасибо. Удачного кодирования.