Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

Posted

技术标签:

【中文标题】Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?【英文标题】:Swift: How to use "prepareForSegue" inside UICollectionViewCell? 【发布时间】:2016-08-18 08:02:39 【问题描述】:

我在 UITableView 中有一个 UICollectionView,当用户点击 UICollectionViewCell 时,我想链接另一个 ViewController。在 UITableViewCell 内部,我从网上下载了所有数据并存储在一个数组中。我通过控制将 CollectionViewCell 拖动到新的 ViewController 并选择“Push”创建了一个 Segue。在新的 ViewController 中,我添加了 UIImageView 的 IBOutlet 以在用户点击缩略图时显示 CollectionViewCell 的图像。现在,当我点击 CollectionViewCell 时,它会转到新的 ViewController,但没有显示图片。这是我的代码,有什么建议吗?

在 UITableViewConroller 中:

import UIKit

class HomePageTableViewController: UITableViewController 
    let sections: NSArray = ["latest news", "good news"]
    var posts1: [Posts] = [Posts]()

override func viewDidLoad() 
    super.viewDidLoad()




override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
  if section < sections.count
        return sections[section] as? String
    

    return nil



override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return sections.count


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 1


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    if indexPath.row == 0 && indexPath.section == 0 
        let tableViewCell = tableView.dequeueReusableCellWithIdentifier("TableViewCell") as! TableViewCell

        tableViewCell.getCategories()
     //   tableViewCell.scrollToNextCell()
     //   tableViewCell.startTimer()


        return tableViewCell

    

在 TableViewCell 内部,代码如下:

import UIKit
import Alamofire
import AlamofireImage


class TableViewCell: UITableViewCell, UICollectionViewDataSource, 

UICollectionViewDelegate 

var posts1: [Posts] = [Posts]()
var posts2: [Posts] = [Posts]()
var categories: [Category] = [Category]()
var selectedPost1: Posts?

@IBOutlet weak var theCollectionView: UICollectionView!

我从 JSON 下载所有数据并将它们放入这些数组中。在这个类中,我也尝试调用该函数:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    print("selected")
    self.selectedPost1 = self.posts1


当我点击一个单元格时打印工作,但我不能在这个函数中使用“prepareForSegue”。查了一下发现这个功能只能在ViewController中使用,请问怎么做呢?

在新的 ViewController 内部,代码如下:

import UIKit

class DetailViewController: UIViewController 

@IBOutlet weak var postImageView: UIImageView!

var posts: [Posts] = [Posts]()
var selectedPost: Posts?

override func viewDidLoad() 
    super.viewDidLoad()



override func viewDidAppear(animated: Bool) 
    if let post = self.selectedPost
        let thumbnailUrlString = post.postThumbnailUrlString
        let imageUrl: NSURL = NSURL(string: thumbnailUrlString)!
        print(thumbnailUrlString)
        postImageView.af_setImageWithURL(imageUrl)
    




自从我下载数据后,我将它们放入 2 个不同的数组中,posts1 和 posts2。我想在新的 ViewController 中显示相应的图像。但是我刚刚创建了一个“selectedPost”数组,我不确定是这个问题吗?而且我不确定是否将数据重新加载到“selectedPost”数组,也许这就是为什么没有显示图像的原因?真的希望有人能给我一些建议。谢谢

【问题讨论】:

【参考方案1】:

您应该使用prepareForSegue:。你需要做的是有一个var selectedIndexPath,只要你选择一个单元格就会设置它。然后在prepareForSegue: 中,您可以访问单元格及其属性,即:

HomePageTableViewController: UITableViewController 
   var selectedIndexPath: NSIndexPath?

   func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
      selectedIndexPath = indexPath
   

   public override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
      super.prepareForSegue(segue, sender: sender)
      let cell = theCollectionView.cellForItemAtIndexPath(selectedIndexPath)
      //do what you need to do
   

【讨论】:

CollectionView 在 TableViewCell 里面,不能在 HomePageTableViewController 里面调用。我需要做什么?谢谢 我明白了。您的 tableView 是否需要成为 collectionView 的代表?如果没有,您可以将 viewController 设置为 collectionView 的委托,即在 collectionView:cellForItemAtIndexPath: 中设置 theCollectionView.delegate = self.delegate? 在 Storyboard 中,我将 TableView 拖到 TableViewController 的数据源并委托。并将 TableViewCell 拖动为 CollectionView 的数据源和委托。所以我想我需要 TableView 作为 CollectionView 的代表。那我该怎么办?此外,由于我将 segue 从 CollectionViewCell 拖动到新的 ViewController,即使我没有添加“prepareForSegue”,当我点击单元格时,它也会进入新的 ViewController。所以我很困惑。谢谢 你能把 ViewController 设置为 CollectionView 的委托(不是数据源)吗? 我可以将 CollectionView 拖到 HomeTableViewController 中,然后选择委托。抱歉,我是 swift 新手,所以还在学习,不确定我是否做得对。

以上是关于Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?的主要内容,如果未能解决你的问题,请参考以下文章

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

如何在 UICollectionView 中实现页面之间的间距?

如何在 UICollectionView 中向下移动某些单元格

如何将数据从 uitableviewcontroller 发送到 uitableviewcell

如何防止两个标签重叠,但具有动态宽度?