gpt4 book ai didi

ios - 如何将 Collection View 单元格的 indexPath 传递给另一个 View Controller

转载 作者:行者123 更新时间:2023-11-28 10:57:08 25 4
gpt4 key购买 nike

我正在学习制作类似 Instagram 的应用程序的教程,该教程介绍了如何在一个 Collection View 中显示所有数据(图像、作者、喜欢等)。我试图做一些不同的事情,所以只有图像显示在 Collection View 中,然后如果点击图像,用户将被带到另一个 View Controller ,其中显示图像和所有其他数据。

所以在我的带有 Collection View 的 View Controller (FeedViewController) 中,我在类外声明了我的帖子数组(Post 是包含上述所有数据的对象):

var posts = [Post]()

然后在 FeedViewController 类中,我的 cellForItemAt indexPath 如下所示:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath) as! PostCell

// creating the cell
cell.postImage.downloadImage(from: posts[indexPath.row].pathToImage)

photoDetailController.authorNameLabel.text = posts[indexPath.row].author
photoDetailController.likeLabel.text = "\(posts[indexPath.row].likes!) Likes"
photoDetailController.photoDetailImageView.downloadImage(from: posts[indexPath.row].pathToImage)

return cell
}

然后我显然也有一个函数来获取数据,如果需要我可以发布,但我认为问题是因为 PhotoDetailController 不知道 indexPath(尽管我可能是错的) .

当我运行应用程序并尝试查看 FeedViewController 时,我遇到了崩溃 fatal error :在展开可选值时意外发现 nil,突出显示 photoDetailController。 authorNameLabel 行。

我是否正确地假设问题是因为 indexPath 仅在 FeedViewController 中的 Collection View 数据源中可用?如果是这样,我如何将该 indexPath 传递给 PhotoDetailController 以便我的代码正常工作?

感谢您的任何建议!

编辑:编辑我的 didSelectItem 方法:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let photoDetailController = self.storyboard?.instantiateViewController(withIdentifier: "photoDetail") as! PhotoDetailController

photoDetailController.selectedPost = posts[indexPath.row]

self.navigationController?.pushViewController(photoDetailController, animated: true)
}

cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath) as! PostCell


cell.postImage.downloadImage(from: posts[indexPath.row].pathToImage)


return cell
}

PhotoDetailController 中:

var selectedPost: Post! 在类中,然后:

override func viewDidLoad() {
super.viewDidLoad()

self.authorNameLabel.text = selectedPost[indexPath.row].author
self.likeLabel.text = "\(selectedPost[indexPath.row].likes!) Likes"
self.photoDetailImageView.downloadImage(from: selectedPost[indexPath.row].pathToImage)
}

但仍然出现错误use of unresolved identifier "indexPath

编辑 2: Storyboard

enter image description here

最佳答案

您遇到此 nil 崩溃是因为此 photoDetailController 尚未加载,所以它的所有导出均为 nil,而且您当前的操作方式也是错误的。

您需要在didSelectItemAt 方法中添加 Controller 代码并执行导航。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let photoDetailController = self.storyboard?.instantiateViewController(withIdentifier: "YourIdentifier") as! PhotoDetailController
photoDetailController.selectedPost = posts[indexPath.row]
self.navigationController?.pushViewController(photoDetailController, animated: true)
}

现在只需在 PhotoDetailController 中创建一个类型为 Post 且名称为 selectedPost 的实例属性,并从此 selectedPost< 设置所有细节 PhotoDetailControllerviewDidLoad 中的对象。

编辑:在PhotoDetailController

中像这样设置您的 viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()

self.authorNameLabel.text = selectedPost.author
self.likeLabel.text = "\(selectedPost.likes!) Likes"
self.photoDetailImageView.downloadImage(from: selectedPost.pathToImage)
}

关于ios - 如何将 Collection View 单元格的 indexPath 传递给另一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com