BDKCollectionIndexView icon indicating copy to clipboard operation
BDKCollectionIndexView copied to clipboard

CollectionView not Responding to Tapped Index List Item

Open MaikoHermans opened this issue 8 years ago • 4 comments

I'm trying to use your framework to be able to get an index list for my collection view. Before actually doing this inside of my project I figured it would be useful to make a test project to test the working and functionality of it first.

this is my entire controller. I'm using swift 3 do you have any idea why it might not be working? is there something I'm doing wrong?

Basically indexViewValueChanged is never called

import UIKit
import BDKCollectionIndexView

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var indexView: BDKCollectionIndexView!
    
    let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
    var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"]

    override func viewDidLoad() {
        super.viewDidLoad()
        let indexWidth: CGFloat = 28

        let frame = CGRect(x: (collectionView.frame.size.width - indexWidth),
                           y: collectionView.frame.size.height,
                           width: indexWidth,
                           height: collectionView.frame.size.height)

        let indexView = BDKCollectionIndexView.init(frame: frame, indexTitles: nil)
        indexView?.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin]
        indexView?.addTarget(self, action: Selector("indexViewValueChanged:"), for: .valueChanged)
        view.addSubview(indexView!)
        self.indexView.indexTitles = items
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.items.count
    }
    
    // make a cell for each cell index path
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        // get a reference to our storyboard cell
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
        
        // Use the outlet in our custom class to get a reference to the UILabel in the cell
        cell.myLabel.text = self.items[indexPath.item]
        cell.backgroundColor = UIColor.cyan // make cell more visible in our example project
        
        return cell
    }
    
    // MARK: - UICollectionViewDelegate protocol
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        // handle tap events
        print("You selected cell #\(indexPath.item)!")
    }

    func indexViewValueChanged() {
        let path = "hello"
        print(path)
    }
    
    func indexViewValueChanged(sender: BDKCollectionIndexView) {
        let path = IndexPath(item: 0, section: Int(sender.currentIndex))
        collectionView.scrollToItem(at: path, at: .top, animated: false)
        // If you're using a collection view, bump the y-offset by a certain number of points
        // because it won't otherwise account for any section headers you may have.
        collectionView.contentOffset = CGPoint(x: collectionView.contentOffset.x,
                                               y: collectionView.contentOffset.y - 45.0)
    }
}

MaikoHermans avatar Jan 23 '17 16:01 MaikoHermans

@MaikoHermans try this indexView!.addTarget(self, action: #selector(ViewController.indexViewValueChanged(sender:)), for: .valueChanged)

athulsai avatar Apr 10 '17 13:04 athulsai

+1 ...it just doesn't work

tamoyal avatar Oct 26 '17 20:10 tamoyal

Yeah, like @athulsai said — I think you'll need to update your syntax to the new Swift 3 #selector format, and it's likely (?) you'll need to mark your action method to be @objc.

override func viewDidLoad() {
    // ...
    indexView?.addTarget(self,
                         action: #selector(indexViewValueChanged(sender:)),
                         for: .valueChanged)
}

// ...

@objc func indexViewValueChanged(sender: BDKCollectionIndexView) {
    // ...
}

kreeger avatar Oct 27 '17 14:10 kreeger

I already using it in my apps , also in Swift 4 alreay but I dont know my action didn't called.

rjalkuino avatar Feb 28 '18 07:02 rjalkuino