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”?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UICollectionView 中实现页面之间的间距?
如何在 UICollectionView 中向下移动某些单元格