选择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 移动到另一个时,如何实现单元格动画?