从collectionView中显示viewController,不带故事板

时间:2017-06-24 16:06:37

标签: swift delegates uicollectionview segue uicollectionviewcell

我在从collectionView以编程方式(没有故事板)显示viewController时遇到了一些麻烦。我认为这很容易,但我很难解决这个问题,因为我对swift有些新意。我相信collectionViewCells默认不是委托,所以我尝试在collectionView类中实现didSelectItemAt,但仍然没有运气。点击单元格我收到一个打印声明,只是没有任何show segue。请参阅下面的collectionViewCell代码,并提前感谢!

// collectionViewCell class
class PlanningCell: BaseCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

    //collectionViewCell variables
    var plannedPlaces = [CurrentPlanner]()   
    let cellId = "cellId"

    var basePlanningCell: BasePlanningCell!

    override func setupViews() {
        super.setupViews()
        addSubview(collectionView)

        collectionView.register(BasePlanningCell.self, forCellWithReuseIdentifier: cellId)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return plannedPlaces.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! BasePlanningCell
        cell.currentPlanner = plannedPlaces[indexPath.item]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("did tap")
        let plannersDetailVC = PlanningPlaceDetailsVC()
        plannersDetailVC.navigationTitle = plannedPlaces[(indexPath.row)].planningPlace
        // below I am receiving the use of unresolved identifier "show" error
        show(plannersDetailVC, sender: self)
    }

}

2 个答案:

答案 0 :(得分:0)

hello

不要忘记设置PlanningPlaceDetailsVC 标识符

针对由代码设置的VC进行了更新:

let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewController(withIdentifier: "VCIdentifier") as! PlanningPlaceDetailsVC
        present(vc, animated: true, completion: nil)

答案 1 :(得分:0)

通常,当您想要呈现另一个视图控制器时,您需要调用此函数

self.present(yourViewController, animated: true, completion: nil)

但是,您无法在执行打印的位置执行此操作,因为函数present仅在视图控制器中可用。所以现在问题变成了,如何将单元格单击指向父视图控制器并传递字符串。您有两个选项,可以创建this之类的委托,也可以创建NSNotificationCenter post call,第二个更容易。

当您将单元格单击事件传递给父视图控制器时,您可以开始调用上面提到的方法以导航到另一个视图控制器