首页 > 解决方案 > 以编程方式从 collectionView Cell didSelectItemAt 推送到新的 ViewController - swift

问题描述

我试图创建一个以编程方式实现的简单应用UICollectionViewController程序。我已经创建了一些单元格,当用户单击特定单元格时应该移动到另一个控制器。但我面临的问题是哪个视图没有推送到下一个视图控制器。

这是我在其中设置 rootViewControllerappDelegate

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    let flow = UICollectionViewFlowLayout()
    let collectionView = ViewController(collectionViewLayout: flow)
    let navigation = UINavigationController(rootViewController: collectionView)
    window?.rootViewController = navigation

这是我创建的方式UICollectionView

private let cellId = "cellid"
var viewController: ViewController?
override func viewDidLoad() {
    super.viewDidLoad()
    collectionView?.backgroundColor = .white
    collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)
    // Do any additional setup after loading the view, typically from a nib.
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
    cell.backgroundColor = .red
    return cell
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: view.frame.width, height: 210)
}

这是我如何控制用户点击特定的

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath.item)
    viewController?.pushView()
}

func pushView() {
    let controller = UINavigationController(rootViewController: DetailController())
    self.navigationController?.pushViewController(controller, animated: true)
}

甚至调用了该函数,但它永远不会推送到新的视图控制器

标签: iosswiftuinavigationcontrolleruicollectionviewcelluicollectionviewflowlayout

解决方案


首先,您必须确保您当前的视图控制器具有导航视图控制器,您可以通过在 viewDidLoad 方法 print(self.navigationViewController) 中打印对象来检查。如果打印 nil,那么您必须按照以下步骤制作导航控制器 - SelectYourVicotroller -> Go to Editor menu option -> Embed to -> Navigation Controller

func pushView() {

    let controller =  DetailController()
    //OR

//Add the storyboard identifier of your view controller - "DetailController"

    let controller =  self.storyboard.instantiateViewController(withIdentifier: "DetailController") as! DetailController

    self.navigationController?.pushViewController(controller, animated:true)

}

将此方法调用到 didSelect 方法中


推荐阅读