如何提取json数组并在没有tableview

时间:2017-01-05 07:15:45

标签: swift

假设我收到了像这样的 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
}

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

enter image description here

当我点击单元格时,它会转到不同的 ViewController ,所以当我点击单元格时,它会通过 单元的product_id ,并使用 product_id 进行另一次发布调用,以显示产品的详细信息。这是下面的产品详细信息页面。

enter image description here

希望有意义。如果您需要,我很乐意提供更多详细信息。很多人都提前感谢。

2 个答案:

答案 0 :(得分:1)

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

你的问题"就是你可以有多个categoryList个项目出现...这就是我猜你首先使用UITableView的原因。

UITableView解决方案#34;我现在应该显示哪个元素",由cellForRowAt传递给您。在该功能中,您只需选择与您即将填充的单元格匹配的JSON项目。

您可以致电:

let categoryList = sCategory[indexPath.row]

我认为sCategorycategoryList项的数组,然后您要求匹配indexPath.row。{/ p>

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

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

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

    在这种情况下,给您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 :)
    }
    
  2. 您不知道使用哪个索引

    在这种情况下,你需要知道要查找,假设您知道product_titleproduct_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 :)
    }
    
  3. 更新(在看过您的更新问题后)

    你说

      

    所以当我点击Cell时,我想要通过相应单元格的product_id并使用该product_id进行另一次调用以显示产品的详细信息。

    我可以看到您已经问过这个问题:how do I change an image by selecting a cell in CollectionView

    这里的答案几乎相同:)

    UITableView有一个UITableViewDelegate就像UICollectionViewUICollectionViewDelegate一样。 UITableViewDelegate可以选择实施的方法之一是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 :)
        }
    }
    

    希望对你有所帮助。

答案 1 :(得分:0)

最后我得到了这样的解决方案

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make