如何在UICollectionView之上呈现UIViewController?

时间:2018-09-07 10:28:35

标签: ios swift uicollectionview

我有一个UICollectionView,它显示图像的缩略图。当我点击该单元格(缩略图)时,我使用下面的功能推入另一个UIViewController,然后可以下载并查看缩略图的放大图像。每个单元格中都有一个UIButton。我想展示另一个viewController,它将用作自定义弹出窗口,希望显示有关图像的更多详细信息,例如文件名,日期等。 action类,并且在UICollectionViewCell函数方法中,我无法“呈现”此自定义IBActionUIViewController只是不承认“现在”。有人可以请教吗?

Xcode

自定义:

 class CollectionViewFolder: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate ,UICollectionViewDelegateFlowLayout{

 ...

     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){

     }

 ...
 }

2 个答案:

答案 0 :(得分:2)

在您的CollectionViewFolderCell.swift

中创建一个协议
protocol CollectionViewFolderCellDelegate {
    func collectionViewFolderCellDidPressButton()
}

CollectionViewFolderCell内声明一个委托,如:

var delegate: CollectionViewFolderCellDelegate?

在按钮操作中添加:

@IBAction func moreInfoBtn(_ sender: Any) {

     delegate?.collectionViewFolderCellDidPressButton()

 }

在您的cellForItemAtIndexPath方法中,添加cell.delegate = self

func collectionView(collectionView: UICollectionView,
                          cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewFolderCell
    cell.delegate = self

    return cell
}

此外,在View Controller中,您还需要符合CollectionViewFolderCellDelegate

extension CollectionViewFolder: CollectionViewFolderCellDelegate {
    // here you can present your desired view controller
}

答案 1 :(得分:1)

present(_:animated:completion:)UIViewController。 为了能够显示(呈现,推送,弹出等)另一个UIViewController,您必须是UIViewController(或者在推送等情况下为特定的UIViewController)。因此,CollectionViewFolderCell无法展示您的新UIViewController

然后,您需要告诉UIViewController(在您的情况下为CollectionViewFolder)(例如,您的情况为CollectionViewFolderCell通过其UICollectionView)来执行此操作。为此,您可以使用委托模式或闭包。

带有封闭符的快速示例代码:

CollectionViewFolderCell添加属性:

var onMoreInfoTap: ((ParamTypeOrClass1, ParamTypeOrClass2, etc) -> Void)?

然后修改您的方法:

@IBAction func moreInfoBtn(_ sender: Any) {
    //Compute all your params, let's name them param1, param2, etc.
    self.onMoreInfoTap?(param1, param2, etc.   
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell上:

cell.onMoreInfoTap = { [weak self] (param1Name, param2Name, etc) in 
     let viewController = //Create your target UIViewController
     //Set its customs var according to Param1Name, Param2Name, etc.
     self?.present(viewController, animated: true, completion:nil)
}