我在一个单独的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。我想这样做...
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..")
}
}