UICollectionView中的ScrollToItem没有发生任何事情

时间:2017-06-09 11:55:01

标签: swift uiview swift3 uicollectionview protocols

我在ViewController中有两个集合视图。一个Collection视图表示顶部的标签栏,另一个表示屏幕下半部分的页面。我在自定义UIView(从另一个类加载)中有第二个UICollectionView(在下半部分)。我的目标是当我点击标签栏时,相应地移动底部collectionView,关于scrollToIndex。我的问题是,当我点击顶部的标签栏,并调用我的自定义UIView中的功能时,没有任何反应。我是否需要通过委托/协议共享信息?我做错了什么?

在我的MainVC中,我有:

/** Setting up the top header **/


 let topBar = UIView()
    /** Setting up the connection to the Bottom Collection View **/
    let mainView = MainViewsHome()

    override func viewWillAppear(_ animated: Bool) {
           self.view.layoutIfNeeded()
        /**Setting up the header that the buttons lay on **/
        topBar.frame = CGRect(x:self.view.frame.width * 0, y:self.view.frame.height * 0, width:self.view.frame.width,height:self.view.frame.height / 6.2)
        topBar.backgroundColor = UIColor.red
        self.view.addSubview(topBar)

        /** Setting up the buttons in the header**/
        setUpHeaderBarButtons()

        /** Setting up the bottom half **/
        mainView.frame = CGRect(x:self.view.frame.width * 0, y:self.view.frame.height / 6.2, width:self.view.frame.width,height:self.view.frame.height / 1.1925)
        mainView.backgroundColor = UIColor.clear
        self.view.addSubview(mainView)
        mainView.delegate = self

    }

&安培;然后设置MainVC的collectionView(条形按钮)

func setUpHeaderBarButtons() {
        let flowLayout = UICollectionViewFlowLayout()
        let collectionView = UICollectionView(frame: CGRect(x: topBar.frame.width * 0, y:topBar.frame.height / 1.75, width: topBar.frame.width, height: topBar.frame.height / 3.6), collectionViewLayout: flowLayout)
        collectionView.register(SelectionCVC.self, forCellWithReuseIdentifier: cellId)
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = UIColor.clear
        topBar.addSubview(collectionView)

    }

&安培;&安培;然后是MainVC的didSelect(条形按钮)

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("selecting cell")
        mainView.moveToPage()
    }

&安培;&安培;然后我的自定义UIVIew与底部集合视图,我希望触发scrollToIndex

class MainViewsHome: UIView, UIGestureRecognizerDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    var cellId = "Cell"

    var collectionView2 : UICollectionView!

     override init(frame: CGRect) {

        super.init(frame: CGRect(x:0, y:0, width:UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 1.27))

        /**Creation of the View **/
        let flowLayout2 : UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        flowLayout2.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        flowLayout2.scrollDirection = .horizontal

        let collectionView2 = UICollectionView(frame: CGRect(x:self.frame.width * 0,y:self.frame.height * 0,width:self.frame.width,height: self.frame.height), collectionViewLayout: flowLayout2)
        collectionView2.register(SelectionCVC.self, forCellWithReuseIdentifier: cellId)
        collectionView2.isPagingEnabled = true
        collectionView2.delegate = self
        collectionView2.dataSource = self
        collectionView2.backgroundColor = UIColor.purple

        self.addSubview(collectionView2)

    }


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

    func moveToPage() {
     //   print("we are moving to page")

        let indexPath = IndexPath(item: 2, section: 0) //Change section from 0 to other if you are having multiple sections
        self.collectionView2?.scrollToItem(at: indexPath, at: [], animated: true)

    }
    }

我哪里错了?

1 个答案:

答案 0 :(得分:1)

In the init of MainViewsHome instead of initializing instance property collectionView2 you are initializing completely new collectionView so you are not having reference in collectionView2.

It should be

self.collectionView2 = UICollectionView(frame: CGRect(x:self.frame.width * 0,y:self.frame.height * 0,width:self.frame.width,height: self.frame.height), collectionViewLayout: flowLayout2)

Instead of

let collectionView2 = UICollectionView(frame: CGRect(x:self.frame.width * 0,y:self.frame.height * 0,width:self.frame.width,height: self.frame.height), collectionViewLayout: flowLayout2)