如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器

Posted

技术标签:

【中文标题】如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器【英文标题】:How to push different view controller from collection view didSelectItemAt based on Json id in swift 【发布时间】:2019-09-28 11:49:06 【问题描述】:

我的项目包含 collectionView.. 但如何根据 json id 从 didSelectItemAt 推送不同的视图控制器。我为每个 id 设置了单独的 vewcontroller .. 但我无法使用基于 json id 的 didSelectItemAt 推送不同的视图控制器。

这是我用于 collectionView 的 Json:


"financer": [
    
        "id": "45",
        "icon": "https://hello.com//images/img1.png"
    
    
        "id": "40",
        "icon": "https://hello.com//images/img2.png"
     
     .
     .
     .
   ]
 

这是我家的收藏查看代码:

import UIKit

struct JsonData 

var iconHome: String?
init(icon: String, tpe: String) 
    self.iconHome = icon



class HomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource 

@IBOutlet weak var collectionView: UICollectionView!

var itemsArray = [JsonData]()
var idArray = [String]()
override func viewDidLoad() 
    super.viewDidLoad()

    homeServiceCall()
    //Do any additional setup after loading the view.
    collectionView.delegate = self
    collectionView.dataSource = self


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


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell

    let aData = itemsArray[indexPath.row]
    cell.paymentLabel.text = aData.typeName

    if let url = NSURL(string: aData.iconHome ?? "") 
        if let data = NSData(contentsOf: url as URL) 
            cell.paymentImage.image = UIImage(data: data as Data)
        
    
    return cell

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as! MakePaymentViewController
    self.navigationController?.pushViewController(nextViewController, animated: true)
    let indexPathHome = indexPath.row
    print("home collectionItem indexpath \(indexPathHome)")



//MARK:- Service-call

func homeServiceCall()

    let urlStr = "https://dev.com/webservices/getfinancer"
    let url = URL(string: urlStr)
    URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in

        guard let respData = data else 
            return
        

        do
            let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
            let financerArray = jsonObj["financer"] as! [[String: Any]]

            for financer in financerArray 

                let id = financer["id"] as! String
                let pic = financer["icon"] as? String
                print("home financer id \(id)")
                self.idArray.append(id)
                print("the home financer idsArray \(self.idArray.append(id))")
                self.itemsArray.append(JsonData(icon: pic ?? ""))
            
            DispatchQueue.main.async 
                self.collectionView.reloadData()
            
        
        catch 
            print("catch error")
        

    ).resume()


当我单击 collectionview 中的任何项目时,我可以推送相同的视图控制器,但我需要根据 json id 推送不同的视图控制器。我不知道如何以及在何处使用 json id 使用 didselectItem atIndexPath 推送不同的视图控制器。任何人都请在这里帮助我。

【问题讨论】:

【参考方案1】:

更新您的 homeServiceCall 函数

func homeServiceCall()

    let urlStr = "https://dev.com/webservices/getfinancer"
    let url = URL(string: urlStr)
    URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in

        guard let respData = data else 
            return
        

        do
            let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
            let financerArray = jsonObj["financer"] as! [[String: Any]]

            for financer in financerArray 

                let id = financer["id"] as! String
                let pic = financer["icon"] as? String

                self.itemsArray.append(JsonData(icon: pic ?? ""))
                self.idArray.append(id)
            
            DispatchQueue.main.async 
                self.collectionView.reloadData()
            
        
        catch 
            print("catch error")
        

    ).resume()

在您的MakePaymentViewController 中创建一个名为financerId 的字符串属性

在您的 didSelect 函数中

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

    if let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as? MakePaymentViewController 
        nextViewController.finacerId = idArray[indexPath.row]
      self.navigationController?.pushViewController(nextViewController, animated: true)
    


更新

for financer in financerArray 
      if let id = financer["id"] as? Int 
          self.idArray.append(id)
      

      if let pic = financer["icon"] as? String 
          elf.itemsArray.append(JsonData(icon: pic))
      

【讨论】:

我没有在 idArray 中获得 ids...控制台中的家庭财务人员 idsArray ()...如果我打印单独的 id...家庭财务人员 id 45 这就是为什么我建议你修改 homeServiceCall 函数,添加那行 self.idArray.append(id) 你将有一个数组存储所有 ids 是的,我是在家庭服务电话中做到的。我已经更新了我的帖子 @iosSwift 当然,我相信问题出在你解析 json 的方式上,顺便说一下,请注意强制转换(!),尽量避免它,使用if let & @改为 987654330@ 您的解决方案是正确的,但我无法将 id 添加到数组中,但如果我将它提供给字符串,我会得到单个 id。如果你有时间,你能告诉我为什么会发生这样的事情。和感谢您提供有关(!)的解决方案的建议。如果让并保护让,我会遵循

以上是关于如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Swift UI集合视图 - 如何在Cell中显示“segued”用户输入?

使用 POST 请求 iOS Swift 3 发送嵌套 JSON

如何在 swift 3.0 中制作 5*8 集合视图 [关闭]

iOS - 使用 Swift 在每个表格视图单元格中获取 JSON 提要

将图像从解析加载到集合视图 Swift

如何在 Swift 5 中使用 Alamofire 解析 json