PvDev
PvDev

Reputation: 829

How to set collection view cell of specific index in iOS Swift?

In profile screen retrieve data from firestore of user name, email id, car category. Here car category are compact, small, midsize and full. And storing carCategory parameter value as String (i.e: CarCategory: "1" that means car category is "0" then its compact car if car category value is "1" then its small).

In user update page, car category is a collection view flow layout is carousel view
if car category cell index path value is 1 then it show cell details without scrolling.

Here is the screenshot of which i excepting ::enter image description here

My question is how to load specific cell index in collection view cell.

Here is the code which i have tried so far::

   **collection view and carousel view**

    var car = [String]()
var carCategory = [ "Compact","small", "Midsize", "Full", "Van/Pick-up" ]
var carCategoryImage = ["compactCar", "smallCar", "mediumCar", "fullCar", "vanPickup"]
var carCategoryMeter = ["3.5 - 4.5m", "2.5 - 3.5m", "4 - 5m", "5 - 5.5m", "5.5 - 6.5m"]

var carCategoryLabel: UILabel?
var carMetersLabel: UILabel?
var carCategoryImageLabel: UIImageView?
var currentPageValue: String?
var currentCell: Int?

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

    return carCategory.count

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! carCollectionSettingCollectionViewCell

    cell.carName.text = carCategory[indexPath.row]
    print("carcategoryIndex\(carCategory)")
    cell.carImage.image = UIImage(named: carCategoryImage[indexPath.row])
    cell.carMeters.text = carCategoryMeter[indexPath.row]




    return cell
}


fileprivate var pageSize: CGSize {
    let layout = self.carCollection.collectionViewLayout as! UPCarouselFlowLayout
    var pageSize = layout.itemSize
    if layout.scrollDirection == .horizontal {
        pageSize.width += layout.minimumLineSpacing
    } else {
        pageSize.height += layout.minimumLineSpacing
    }
    return pageSize
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let layout = carCollection.collectionViewLayout as! UPCarouselFlowLayout
    let pageSide = (layout.scrollDirection == .horizontal) ? self.pageSize.width : self.pageSize.height
    let offset = (layout.scrollDirection == .horizontal) ? scrollView.contentOffset.x : scrollView.contentOffset.y
    currentPage = Int(floor((offset - pageSide / 2) / pageSide) + 1)
    print("currentpage::::\(currentPage)")


}

fileprivate var currentPage: Int! {
    didSet {

        currentPage = self.currentCell
        print("currentapge::::\(currentPage)")

        let character = self.carCategory[self.currentPage!]
        print("character::::\(character)")

    }
}

   func loadUserData(){


    API.User.observeCurrentUser { (user) in

        if self.userName.text != nil {
            self.userName.text = user.username
            print("username:::\(String(describing: user.username))")
        }
        if let photoUrlString = user.profileImageURL {
            let photoUrl = URL(string: photoUrlString)
            self.profileImage.sd_setImage(with: photoUrl)
        }

        if self.email.text != nil {

            self.email.text = user.email


        }





            switch user.carCategory {

            case "0":

                self.carCategoryLabel?.text = "Compact"
                self.carMetersLabel?.text = "3.5 - 4.5m"
                self.carCategoryImageLabel?.image = UIImage(named: "compactCar")
                self.currentCell = 0
                print("currentCell:::\(String(describing: self.currentCell))")
                self.carCollection.reloadData()

            case "1":

                self.carCategoryLabel?.text = "Small"
                self.carMetersLabel?.text = "2.5 - 3.5m"
                self.carCategoryImageLabel?.image = UIImage(named: "smallCar")
                self.carCategoryLabel?.text = "1"
                self.currentCell = 1
                print("currentCell:::\(String(describing: self.currentCell))")
                self.carCollection.reloadData()


            case "2":

                self.carCategoryLabel?.text = "Midsize"
                self.carMetersLabel?.text = "4 - 5m"
                self.carCategoryImageLabel?.image = UIImage(named: "mediumCar")
                self.currentCell = 2
                print("currentCell:::\(String(describing: self.currentCell))")
                self.carCollection.reloadData()
            case "3":

                self.carCategoryLabel?.text = "Full"
                self.carMetersLabel?.text = "5 - 5.5m"
                self.carCategoryImageLabel?.image = UIImage(named: "fullCar")
                self.currentCell = 3
                print("currentCell:::\(String(describing: self.currentCell))")
                self.carCollection.reloadData()

            case "4":

                self.carCategoryLabel?.text = "Van/Pick-up"
                self.carMetersLabel?.text = "5.5 - 6.5m"
                self.carCategoryImageLabel?.image = UIImage(named: "vanPickup")
                self.currentCell = 4
                print("currentCell:::\(String(describing: self.currentCell))")
                self.carCollection.reloadData()


            default:

                self.carCategoryLabel?.text = ""
                self.carMetersLabel?.text = ""
                self.carCategoryImageLabel?.image = UIImage(named: "")

                break
            }





    }


}//loaduserData

Upvotes: 0

Views: 6235

Answers (2)

Starsky
Starsky

Reputation: 2038

Here is how this can be done:

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.selectItem(at: [0, currentCell], animated: false, scrollPosition: .centeredHorizontally)
    }

When you load your viewController, I assume you set up the currentCell? I can't see your original viewDidLoad() or viewDidAppear() functions. If you instantiate this viewController from a previous viewController, then set your currentCell from there. If you segue to this viewController, set it in the prepareForSegue method.

Upvotes: 3

The code below might help you in this scenerio

// MARK: - Collectionview delegates
    extension FaqcategoriesViewController : UICollectionViewDelegate, UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return (Global.shared.FAQsCategoriesList?.list.count)!
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "faqcategoriesCollectioncell",
                                                      for: indexPath) as! FAQCategoryCollectionViewCell
        cell.configure(data: (Global.shared.FAQsCategoriesList?.list[indexPath.row])!)
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        let storyBoard = Utilities.getStoryboard(name: SBMEMBERSANDCOMMISSIONS)
        let nextView  = storyBoard.instantiateViewController(withIdentifier: "faq") as! FAQViewController
        nextView.id = indexPath.row
        self.navigationController?.pushViewController(nextView, animated: false)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
        let collectionViewSize = collectionView.frame.size.width
        print(self.view.frame.width)
        print(collectionView.frame.size.width)
        print( "width: \(collectionViewSize/2 - 20) height: \(collectionView.frame.size.height/3.3)")
        return CGSize(width: collectionViewSize/2 - 5, height: collectionView.frame.size.height/3.3)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }

    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }

}

Upvotes: 1

Related Questions