如何从嵌入在 UITableViewCell (Swift) 中的 UICollectionView 的单元格中分离出来?
Posted
技术标签:
【中文标题】如何从嵌入在 UITableViewCell (Swift) 中的 UICollectionView 的单元格中分离出来?【英文标题】:How can I segue from UICollectionView's cells embedded inside UITableViewCell (Swift)? 【发布时间】:2015-12-28 00:51:04 【问题描述】:我已经使用this tutorial 成功地将UICollectionView
嵌入到我的ViewController 中的UITableView
中。
如果您快速查看链接教程的代码,以下内容可能会更有意义(加上它也是一个非常值得学习的东西!):
对我来说,下一步是从 tableView 的 UITableViewCell
s 内的 UICollectionView
的单元格执行 segues,但由于 collectionView 出口是在单独的视图控制器中建立的,我不知道如何引用它在主 ViewController 中。
在 TableViewCell.swift 中有:
class TableViewCell: UITableViewCell
@IBOutlet private weak var collectionView: UICollectionView!
extension TableViewCell
func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>>(dataSourceDelegate: D, forRow row: Int)
collectionView.delegate = dataSourceDelegate
collectionView.dataSource = dataSourceDelegate
collectionView.tag = row
collectionView.reloadData()
例如,在 ViewController.swift 中,我需要能够在 ViewController.swift 文件中的 prepareForSegue
函数中调用 TableViewCell 中的 collectionView。我只需要用 collectionView 插座来填补空白:
let destination = segue.destinationViewController as! SecondViewController
let indexPaths = self.___________.indexPathsForSelectedItems()
let indexPath = indexPaths![0] as NSIndexPath
let arrayObject = self.arrayObjects[indexPath.row]
destination.object = arrayObject
'object' 在 SecondViewController 中实现,就像这样,var object: PFObject!
。
我现在需要用 collectionView 填补上述代码中的空白,________,以便在 SecondViewController(destinationViewController)中显示正确的“对象”
【问题讨论】:
【参考方案1】:-
将 UICollectionViewCell 中的 Push Segue 添加到 IB 中的 YourViewController。
为您的 segue 提供一个标识符(“YourSegueIdentifier”)。
在您的自定义 UITableViewController 或 UIViewController 中,覆盖 prepareForSegue() 方法。
这是:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "YourSegueIdentifier"
if let collectionCell: YourCollectionViewCell = sender as? YourCollectionViewCell
if let collectionView: UICollectionView = collectionCell.superview as? UICollectionView
if let destination = segue.destination as? YourViewController
// Pass some data to YourViewController
// collectionView.tag will give your selected tableView index
destination.someObject = tableObjects[collectionView.tag].someObject
destination.productId = collectionCell.product?.id
【讨论】:
【参考方案2】:你好,我遇到了同样的问题
这就是我所做的:
1.在您的第一个视图控制器中为扩展中的单元格设置标签
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("advertisementCollectionCell",forIndexPath: indexPath) as! AdvertisementCollectionViewCell
// set your cell information
cell.tag = indexPath.row
return cell
2。在情节提要上从 UIcollectionViewCell 到新的 View Controller 进行转场
3.在 prepareForSegue
第一个 TableViewController 中:
else if segue.identifier == "identifier"
let destinationViewController = segue.destinationViewController as! DestinationViewController
if let cell = sender as? MyCollectionViewCell
let indexPath = cell.tag
// use indexPath :D
【讨论】:
【参考方案3】:我刚刚使用了您附加的代码。我在故事板中手动添加了 segue。它很容易调用。
1) 只需将视图控制器添加到情节提要。
2) Controll+从collectionview
单元格拖放segue
【讨论】:
【参考方案4】:在您的代码中,对 CollectionView 的引用在 TableViewCell 中连接。 因此,您可以通过 TableViewCell 引用它并设置数据源和委托。 要将连接添加到您的代码中,您必须使用 RightButton 选择 CollectionView 并将其拖放到 @IBOutlet private weak var collectionView: UICollectionView! 当点击 CollectionViewCell 时,UICollectionViewDelegate 的 collectionView(collectionView:UICollectionView, didselecteditemAtIndexPath indexPath: NSIndexPath) 函数会被委托调用。 届时,您可以通过在该函数中调用 performSegue 来进行 segue。 正如您在代码中编写的那样,tableview 的索引是按标签设置的,因此您可以使用 collectionView.tag() 按标签获取索引 代码如下。 var tableViewIndex = collectionView.tag() 因此,您可以使用 tableViewIndex 和 indexPath 引用正确的单元格。
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
var tableViewIndex = collectionView.tag;
self.performSegueWithIdentifier("segueIdentifier", sender: self)
【讨论】:
嗨,这很好用,但我确实需要能够引用 collectionView 插座本身,因为我需要能够将数据从单元格传输到目标视图控制器。 (对不起,我应该在最初的问题中明确表示!)我是否能够在 didSelectItemAtIndexPath 内部准备这些数据(从 Parse 后端提取的数组)?因为目前它一直在抛出错误 有可能。你不是在ViewConroller中实现UICollectionView的delegate和datasource吗?我认为您在 ViewController 中实现 UITableViewDelegate 和 UITableViewDatasource 并使用 setCollectionViewDataSourceDelegate。如果是这样,单击单元格时将调用 didselectitematindexpath。重要的是您必须在 ViewController 中实现 UICollectionViewDelegate 和 UICollectionViewDatasource 并使用 setCollectionViewDataSourceDelegate 进行设置。 是的,这部分一切都很好,但我需要引用 prepareForSegue 中的插座,以便目标视图控制器显示正确的数据。我已经更新了我的问题以更好地解释这一点。感谢您迄今为止的帮助以上是关于如何从嵌入在 UITableViewCell (Swift) 中的 UICollectionView 的单元格中分离出来?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UILabel *not* 将触摸传递给它嵌入的 UITableViewCell?
如何将 UITextView 嵌入 UITableViewCell 与作为委托的自定义单元格?
在 UITableViewCell 中嵌入 MPMoviePlayerController