选择collectionView单元格时如何获取项目ID

Posted

技术标签:

【中文标题】选择collectionView单元格时如何获取项目ID【英文标题】:how to get item id when collectionView cell is selected 【发布时间】:2021-04-07 05:28:37 【问题描述】:

我只想在选择collectionView的项目时将项目id传递给下一个视图控制器。

我在这里存储从 API 获得的数据

这里有一些代码 -->

var posts = [[String: Any]]()
func apicall() 
        let Url = String(format: "http:example.com")
        guard let serviceUrl = URL(string: Url) else  return 
        
        var request = URLRequest(url: serviceUrl)
        request.httpMethod = "POST"
        request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
        
        
        let session = URLSession.shared
        session.dataTask(with: request)  (data, response, error) in
            if let response = response 
                print(response)
            
            if let data = data 
                do 
                    if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
                        
                        self.posts = (json["data"] as? [[String : Any]])!
                        
                        DispatchQueue.main.async() 
                            self.collectionView.reloadData()
                        
                    
                 catch 
                    print(error)
                
            
            .resume()
    

现在我得到了数据,我想传递只选择的那个项目的项目 ID

 @IBAction func onClickNext(_ sender: Any) 
        let controller = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as! secondViewController
        self.navigationController?.pushViewController(controller, animated: true)
       
    

这里是 didSelectItemAt 索引路径的代码

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        let cell = collectionView.cellForItem(at: indexPath) as! secondCollectionViewCell

【问题讨论】:

item id 是什么意思?该代码不包含id 之类的任何内容。 cell id 表示我从 API 响应中获得的单元格 id -- 例如 - "__v" = 3; "_id" = 60356f; createdAt = "2021-04-06T06:40:53.128Z";图标 = "";编号 = 60356f;名称 = abc;更新时间 = "2021-04-06T06:40:53.128Z"; 这是来自 API 的响应,我在 collectionView 项目中使用了名称和图标,但 id 没有使用,我将 id 传递给下一个视图控制器 【参考方案1】:

始终从模型(数据源数组)获取数据,而不是从视图

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        let item = self.posts[indexPath.item]
        let id = item["id"]
        // do things with id

【讨论】:

现在请告诉我如何将此 id 传递给下一个视图控制器,我使用它 --> @IBAction func onClickNext(_ sender: Any) let controller = self.storyboard?.instantiateViewController( withIdentifier: "CreateGrupNameViewController") as! CreateGrupNameViewController self.navigationController?.pushViewController(controller, animated: true) controller.groupId = id 它显示了错误未解析的标识符 id 删除 IBAction 并在 didSelect 中实例化控制器或使用临时属性。 我不能删除它,因为下一个按钮是必需的,只有当用户选择项目点击下一个按钮时才传递数据 然后创建一个临时属性。【参考方案2】:

那时,如果您启用了选择,则集合视图将能够为集合视图中的所有选定单元格返回IndexPath。 请在UICollectionView查看此属性

var indexPathsForSelectedItems: [IndexPath]?  get 

apple documentation for indexPathForSelectedItems

然后在您的@IBAction func 上执行此操作

@IBAction func onClickNext(_ sender: Any) 
  // logic to grab the id from self.posts using the selected indexPaths ie.
  let selectedItems = self.collectionView.indexPathsForSelectedItems ?? []
  let ids = selectedItems.compactMap  self.posts[$0.row] 

  let controller = self.storyboard?.instantiateViewController(withIdentifier: 
           "secondViewController") as! secondViewController
  controller.selectedIds = ids // all the selected ids
  
  self.navigationController?.pushViewController(controller, animated: true)

所以你应该这样做,我不知道数据结构在你的 self.posts 属性中是什么样子的,但上面的代码给了你一个想法。为了简化这一点,请尝试在 Playground 中运行以下代码并查看结果。

import UIKit

let posts: [String] = ["Carrot_Post", "Pencil_Post", "Dish_Post", "Data_Post",
                       "ios_Post", "Kitties_Post", "VideoGamesPost", "Bitcoin_Post"]
let selected: [Int] = [1, 3, 0, 5]

let items: [String] = selected.compactMap( posts[$0] )

print(items) // output: ["Pencil_Post", "Data_Post", "Carrot_Post", "Kitties_Post"]

希望对您的问题有所帮助。

【讨论】:

以上是关于选择collectionView单元格时如何获取项目ID的主要内容,如果未能解决你的问题,请参考以下文章

ios:在点击collectionview单元格或tableview单元格时禁用第二个触摸事件

隐藏collectionview单元格时关闭空间?

单击collectionview的单元格时打开另一个视图控制器

当它从一个 collectionView 移动到另一个时,如何实现单元格动画?

如何将值从 tableview 传递到 collectionview

根据 CollectionView 中的选择更改 ImageView