Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue

Posted

技术标签:

【中文标题】Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue【英文标题】:Swift: How to Use Segue when UICollectionViewCell(inside a UITableViewCell) is selected 【发布时间】:2016-08-17 13:38:49 【问题描述】:

我想使用 segue 显示所选 UICollectionViewCell 的详细信息页面,但是此单元格位于 UITableViewCell 内。问题是我不能在 TableViewCell 中使用“performSegueWithIdentifier”(包含 CollectionView),我知道这个函数只能在 UIViewController 中使用,但我的数据(来自 JSON)是在 TableViewCell 中获取的。我不知道如何从 ViewController 访问这些,或者我可以使用其他方式在 TableViewCell 中选择 CollectionViewCell。这是我的代码:

class TableViewCell: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegate 

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

我有 2 个数组(post1 和 posts2),我希望 segue 显示 posts1 和 posts2 数组中所有项目的详细信息。

我尝试添加功能:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    self.selectedPost1 = self.posts1[indexPath.row]



但在里面我不能调用“performSegueWithIdentifier”。有关解决此问题的任何建议?谢谢。

【问题讨论】:

【参考方案1】:

在 viewController 上使用 prepareForSegue,您可以检查所需的标识符,然后实例化您想要移动到的正确视图控制器。你可以查看这个example

【讨论】:

我知道在 UITableViewController 或 UIViewController 中如何使用它,但是我的单元格在另一个单元格中,如何在一个单元格中调用此函数? 你的单元格必须有一个主 UITableViewController 吗?您创建了从单元格到详细视图的转场?我的建议是你去你的 UITableViewController 你覆盖prepareForSegue(而不是performSegueIdentifier)。比如这样 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) if (segue.identifier == "Load View") // 将数据传递到下一个视图 是的,我已经这样做了。但是我在传递数据时遇到了麻烦。我从互联网上下载了所有数据并将它们存储在一个数组中,该数组位于 UICollectionView 类中(位于 TableView 内)。如何在主 UITableViewController 中传递它们?就像我所有的数据都存储在“posts1”中一样,我怎样才能将它们传递给主 UITableView?谢谢。抱歉,我是 Swift 新手。【参考方案2】:

你需要在你的 uitableviewcell 中添加一个扩展

extension UITableViewCell 
var parentViewController: UITableViewController? 
    var parentResponder: UIResponder? = self
    while parentResponder != nil 
        parentResponder = parentResponder!.nextResponder()
        if let viewController = parentResponder as? UITableViewController 
            return viewController
        
    
    return nil

然后在 didSelectItemAtIndexPath 中

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    collectionView.deselectItemAtIndexPath(indexPath, animated: true)
    if let tableController = parentViewController as? NameOfYourTableViewController 
        tableController.performSegueWithIdentifier(SegueIdentifier, sender: nil)
    

【讨论】:

以上是关于Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 的不可见单元格未被取消选择 - Swift

在点击时切换 UICollectionView Cell 的选择/取消选择状态 - Swift

如何在UICollectionview在swift 3中滚动时禁用UICollectionViewCell

UITableViewCell 中的 Swift UICollectionView 不起作用

UICollectionview 将数据追加到数组 Swift

Swift UIcollectionView 在同一个 ViewController 上更改第二个 UICollectionView 的内容?