如何提取json数组并在没有tableview的情况下使用它

Posted

技术标签:

【中文标题】如何提取json数组并在没有tableview的情况下使用它【英文标题】:how to extract json array and use it without tableview 【发布时间】:2017-01-05 07:15:45 【问题描述】:

假设我收到了这样的 JSON 响应:


"product_list" =     (
            
        "product_id" = 33;
        "product_image" =             (
        );
        "product_sku" = asdasd;
        "product_title" = "Product 1";
    ,
            
        "product_id" = 58;
        "product_image" =             (
        );
        "product_sku" = kkkk222;
        "product_title" = p1;
    ,
            
        "product_id" = 119;
        "product_image" =             (
        );
        "product_sku" = 123456;
        "product_title" = product;
    ,
            
        "product_id" = 120;
        "product_image" =             (
        );
        "product_sku" = 456789;
        "product_title" = "product 3";
    
);
  "xxx_api" = "product_information";

这就是我使用 cellForRowAt indexPath 填充表格的 Cell 的方式。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell: SpecificCatagoryBodyCell = tableView.dequeueReusableCell(withIdentifier: "SpecificCatagoryBodyCell") as! SpecificCatagoryBodyCell

    let categoryList = sCategory[indexPath.row]
    cell.product_id.text = String(categoryList.product_id)    
    cell.sCategoryName.text = categoryList.product_title

    let profileImage = categoryList.product_image
    SDWebImageManager.shared().downloadImage(with: profileImage, options: [], progress: nil)  downloadedImage, error, cacheType, isDownloaded, url in
            cell.sCategoryImage.image = downloadedImage
        

    return cell

如果我想填充 tableViewCell ,一切都很好。问题是有时我需要使用不同的数据来拨打任何电话,假设这里我需要来自 JSON 响应的 product_id 并使用相应的号码拨打电话。如何提取 tableView 索引之外的数字,可以将其提取到函数中,将其存储在变量中并使用它。这是我提供的视觉效果,以便更好地理解。在第一张图片中,您可以看到表格中有 Cell

当我点击 Cell 时,它会转到不同的 ViewController ,所以我希望当我点击 Cell 时它会通过 product_id 并使用该 product_id 进行另一个 post 调用以显示产品的详细信息。这是下面的产品详细信息页面。

希望这是有道理的。如果您需要,我很乐意提供更多详细信息。非常感谢。

【问题讨论】:

【参考方案1】:

我可能在这里遗漏了一些细节,但是...

你的“问题”是你可以有不止一次出现categoryList 项目......这就是我猜你首先使用UITableView 的原因。

在您的UITableView 中,“我现在应该显示哪个元素”的解决方案由cellForRowAt 提供给您。在该函数中,您只需选择与您现在要填充的单元格匹配的 JSON 项目。

您可以调用:

let categoryList = sCategory[indexPath.row]

我假设sCategory 是一组categoryList 项目,然后您在其中要求匹配indexPath.row 的项目。

因此,如果您想使用sCategory 数组中特定产品的product_id,您需要知道要使用数组中的哪个 产品。

这可以通过多种方式完成。

    您已经知道要使用哪个索引

    在这种情况下,为您提供product_id 的简单方法可能如下所示:

    func productId(fromIndex index: Int) -> Int? 
        guard sCategory.count > index else  //just a check to make sure the index actually exists in your collection
            return nil
        
        return sCategory[index].product_id
    
    

    这样使用:

    if let productId = productId(fromIndex: someIndexYouAlreadyKnow) 
         //You're in business :)
    
    

    您不知道要使用哪个索引

    在这种情况下,您需要知道要查找的内容,假设您知道 product_title 并且 product_title 是唯一的。

    然后你可以写一个这样的函数:

    func productId(forTitle productTitle: String) -> Int? 
        let candidates = sCategory.filter  $0.product_title == productTitle
        guard candidates.count == 1 else  //assure that we have exactly one hit
            return nil
        
        return candidates.first!.product_id
    
    

    你可以这样使用:

    if let productId = productId(forTitle: "Product 1") 
         //You're in business :)
    
    

更新(在看到您更新的问题后)

你说

所以我希望当我点击 Cell 时,它会传递相应单元格的 product_id 并使用该 product_id 进行另一个帖子调用以显示产品的详细信息。

我看你已经问过这个问题了:how do I change an image by selecting a cell in CollectionView

这里的答案几乎是一样的:)

UITableView 有一个UITableViewDelegate,就像UICollectionView 有一个UICollectionViewDelegateUITableViewDelegate 可以选择实现的方法之一是tableView(_:didSelectRowAt:),它甚至可以为您提供所选行的indexPath

因此,如果您有我之前建议的方法productId(fromIndex: ),您可以按照以下方式做一些事情

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    if let productId = productId(fromIndex: indexPath.row) 
        //you now have the productId matching the selected row, use that for you further adventures :)
    

希望对你有所帮助。

【讨论】:

我真的很感谢你的努力,真的很慷慨。请多帮帮我,我很挣扎。我真的很想向你们学习。我已经更新了问题,如果您需要更多详细信息,请告诉我。 是的,它相对简单,我得到了答案。非常感谢您的友好回复。我之前做了一个静态项目,我从那里得到了这个想法,当然你的回答也帮助我得到了这个想法。我是第一次与 json 合作,我的公司为我处理了一个庞大的项目,我作为一名 ios 开发人员独自在这里工作,没有同事的帮助。因此,有时我会向 *** 提问。如果有人指导我解决这个问题,那就相对简单了。 这很容易......当你知道怎么做的时候 :) 很高兴你成功了【参考方案2】:

我终于得到了这样的解决方案

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    if( segue.identifier == "productList_to_detail" ) 

        let VC1 = segue.destination as! ShopItemVC
          if let indexPath = self.tableView.indexPathForSelectedRow 
                let productIdToGet = sCategory[indexPath.row]
                VC1.product_id = productIdToGet.product_id
            
        
    

【讨论】:

以上是关于如何提取json数组并在没有tableview的情况下使用它的主要内容,如果未能解决你的问题,请参考以下文章

在swift 5中将json数据获取到tableview

我如何解析 JSON,将其排序为数组。提取数据并填充到表格视图中?

如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用

如何快速组合数组中的元素并在tableView上显示

从 JSON 数组中提取数据以创建 3 个不同的数组

如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)