如何从嵌入在 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 的 UITableViewCells 内的 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 呈现 UIView

在 UITableViewCell 中嵌入 MPMoviePlayerController

当移动到嵌入在 UITableViewCell 中的 UITextView 中的新行时,光标消失

iOS Swift - 嵌入在 UITableViewCell 中的 AVPlayer