在每个UICollectionViewCell

时间:2019-01-07 07:23:37

标签: ios swift uiviewcontroller uicollectionviewcell

我正在创建一个基本应用程序,只是为了学习快速编程的新概念,我有一个普遍的问题: 在我的根视图控制器中,我有一个集合视图。在此集合视图中,在每个单元格中,我想显示一个不同的UIViewController,其中附加了不同的UINavigationController。我没有担心,因为我没有这样做: 1.那件事甚至可能吗?这是一个好习惯吗? 2.最佳做法是什么?初始化视图控件并将它们分配给cellForItemAt中的每个单元格? 3.是否需要缓存视图控制器?

那些是主要的麻烦制造者。 SectionViewController假定是我的主屏幕视图,其中包含导航栏和另一个模拟选项卡栏的UICollectionView。在标签栏下,我想要有问题的UICollection视图。请注意,这段代码只是一个通用结构,因为我真的不知道下一步该怎么做。

class SectionViewController: UIViewController {

    let mainView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.green
        return view
    }()

    let sections = HomeCollectionView()

    var menuBar: MenuBar? = nil

    var settingsLauncher = SettingsLauncher()

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.title = "Home"
        let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width - 32, height: view.frame.height))
        titleLabel.textColor = UIColor.white
        titleLabel.text = "Home"
        navigationItem.titleView = titleLabel

        navigationController?.navigationBar.isTranslucent = false

        setupMenuBar()
        setupNavigationButtons()
    }

    private func setupNavigationButtons(){
        var dotsImage = UIImage(named: "3dots")?.withRenderingMode(.alwaysOriginal)
        dotsImage = UIImage.resizeImage(image: dotsImage! , newWidth: 20)
        let dots = UIBarButtonItem(image: dotsImage , style: .plain, target: self, action: #selector(optionsMenuAction))
        navigationItem.rightBarButtonItem = dots
    }

    @objc func optionsMenuAction(){
        settingsLauncher.showSettings()
    }

    private func setupMenuBar(){

        // add menu bar and constraints for menu bar
        menuBar = MenuBar()
        view.addSubview(self.menuBar!)
        view.addSubview(sections)

        view.addConstraintsWithFormat(format: "H:|[v0]|", views: self.menuBar!)
        view.addConstraintsWithFormat(format: "H:|[v0]|", views: self.sections)
        view.addConstraintsWithFormat(format: "V:|[v0(30)][v1]|", views: self.menuBar! , self.sections)
    }
}

class HomeCollectionView: UIView , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout {

    override init(frame: CGRect){
        super.init(frame: frame)

        collectionView.register(SectionCell.self, forCellWithReuseIdentifier: cellID)

        addSubview(collectionView)

        addConstraintsWithFormat(format: "H:|[v0]", views: collectionView)
        addConstraintsWithFormat(format: "V:|[v0]", views: collectionView)
    }

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.minimumLineSpacing = 0
        layout.scrollDirection = .horizontal
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.yellow
        cv.delegate = self
        cv.dataSource = self
        return cv
    }()


    let cellID = "SectionCell"

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath)
        cell.backgroundColor = UIColor.blue
        return cell
    }

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

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

编辑: 看来这不是达到我目的的最佳做法。我的最终目标是创建一个具有UICollectionViewController子视图的控制器,该控制器在每个单元格中拥有一个代表我应用程序页面的不同UIView,您可以在它们之间滑动。我有自定义的NavBar,所以我不想使用分页控制器。

这是我想要实现的行为类型: enter image description here

我已经有了这个标签栏,我需要将其与下面的CollectionView连接。但首先要注意的是:我需要找出在单元内部加载不同UIView的最佳方法。我是否需要一次全部创建它们以保存其实例?

0 个答案:

没有答案