如何从UICollectionView的“ didSelectItemAt”以编程方式推送UIViewController(使用单独的文件?)>

问题描述 投票:1回答:1

我在一个单独的swift文件中设置了一个UICollectionView,该文件正在HomeViewController上显示。选择集合视图单元格时,我想推送一个DetailViewController。我想以编程方式执行此操作,而没有情节提要。我一直使用“ navigationController.pushViewController(vc,animated:true)”推送ViewControllers,但无法从UICollectionView的“ didSelectItemAt”函数中访问navigationController。如果重要的话,我确实设置了一个自定义UICollectionViewCell并将其用于单元格。

我该如何进行这项工作? collectionView显示正确,并且当我选择一个单元格时,我知道didSelectItemAt正在运行,因为控制台中显示了我的打印语句“ Did select item at ...”。

经过数小时的搜寻,我无法弄清楚。我仍在学习M-V-C结构,因此我可能在所有设置方面都存在根本缺陷。我还看到可能需要创建一个自定义委托来处理此问题,但是我感觉缺少了更简单的东西,因为didSelectItemAt函数就在那里。

这是我的UICollectionView swift文件中的相关代码:

class HomeDataController: NSObject, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

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

        print("Did select item at...")
        // this is where I am trying to push the DetailViewController

    }
}

这是我的HomeViewController:

class HomeViewController: UIViewController {

    let collectionView: UICollectionView = {
            let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .vertical
            layout.minimumLineSpacing = 30
            layout.sectionInset.top = 20
            layout.sectionInset.bottom = 20

            let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
            cv.translatesAutoresizingMaskIntoConstraints = false
            cv.backgroundColor = UIColor(named: "background")
            cv.register(HomeCustomCell.self, forCellWithReuseIdentifier: "homeCell")
            return cv
        }()

    let dataController: HomeDataController = {
        let dataController = HomeDataController()
        return dataController
    }()


    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.dataSource = self.dataController
        collectionView.delegate = self.dataController

        view.addSubview(collectionView)
    }
}

我在一个单独的swift文件中设置了一个UICollectionView,该文件正在HomeViewController上显示。选择集合视图单元格时,我想推送一个DetailViewController。我想这样做...

ios swift view uiviewcontroller uicollectionview
1个回答
0
投票
class HomeViewController: UIViewController {

let collectionView: UICollectionView = {
            let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .vertical
            layout.minimumLineSpacing = 30
            layout.sectionInset.top = 20
            layout.sectionInset.bottom = 20

            let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
            cv.translatesAutoresizingMaskIntoConstraints = false
            cv.backgroundColor = UIColor(named: "background")
            cv.register(HomeCustomCell.self, forCellWithReuseIdentifier: "homeCell")
            return cv
        }()

    lazy var dataController: HomeDataController = {
        let dataController = HomeDataController(controller: self)
        dataController.didSelectionCompletion = { indexPath in
            print("Called...")
        }
        dataController.delegate = self
        return dataController
    }()


    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.dataSource = self.dataController
        collectionView.delegate = self.dataController

        view.addSubview(collectionView)
    }
}

//MARK: - HomeDataControllerDelegate 
extension HomeViewController : HomeDataControllerDelegate {
    func homeDataController(_ controller: HomeDataController, didSelectItemAt: IndexPath) {
        print("Called..")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.