Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Achieve button click in UICollectionView

Is there a way I can get the button click event from a button inside a UICollectionViewCell? I used a nib to populate the collection view, the cell has the button but its action is not getting called. I think the problem is with the delegate being called. How can I fix this?

How I created :

  1. Added an empty nib, created a collection view cell
  2. Added a .h and .m file and made the cell nib's files owner as the class created
  3. Wrote an action in the class.
  4. Connected the button to the action

Is there a way I can get the action? What am I doing wrong?

like image 307
Lithu T.V Avatar asked Dec 20 '12 06:12

Lithu T.V


People also ask

How do I select an item in CollectionView?

Single selectionWhen the SelectionMode property is set to Single , a single item in the CollectionView can be selected. When an item is selected, the SelectedItem property will be set to the value of the selected item.

How do I add a button in collection view?

Go to the Storyboard and drag a Right Bar Button Item to right side of the Navigation Bar of the Collection View Controller. Select the Bar Button Item and go to the Attributes inspector. Change the Custom Item Value to Add in the Bar Button Item section.

How does swift implement UICollectionView?

Select the Main storyboard from the file browser. Add a CollectionView by pressing command shift L to open the storyboard widget window. Drag the collectionView onto the main view controller. Add constraints to the UICollectionView widget to ensure that the widget fills the screen on all devices.

What is CollectionView delegate?

A collection view delegate manages user interactions with the collection view's contents, including item selection, highlighting, and performing actions on those items. The methods of this protocol are all optional. When configuring the collection view object, assign your delegate object to its delegate property.


3 Answers

It is important that you create the cell in the Nib by dragging a "Collection View Cell" from the Objects panel. If you use an UIView and just change the class for this cell in the Identity Inspector then the action will not work.

like image 110
MacMark Avatar answered Nov 04 '22 06:11

MacMark


Add the button action like this:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellId" forIndexPath:[indexPath row]]; 

    [[cell myButton] addTarget:self action:@selector(myClickEvent:event:) forControlEvents:UIControlEventTouchUpInside];

    return cell;

}


- (IBAction)myClickEvent:(id)sender event:(id)event {

    NSSet *touches = [event allTouches];

    UITouch *touch = [touches anyObject];

    CGPoint currentTouchPosition = [touch locationInView:_myCollectionArray];

    NSIndexPath *indexPath = [_myCollectionArray indexPathForItemAtPoint: currentTouchPosition];

}
like image 26
bloque13 Avatar answered Nov 04 '22 04:11

bloque13


Here is swift 3.1 code

// 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! BlueCircleViewCell

    // Use the outlet in our custom class to get a reference to the UILabel in the cell
    cell.bgImage.image = UIImage(named: items[indexPath.row])
    cell.addButton.addTarget(self, action: #selector(addCircle(_:)), for: .touchUpInside)

//        cell.backgroundColor = UIColor.cyan // make cell more visible in our example project

    return cell
}

func addCircle(_ sender:UIButton){
    //CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    let buttonPosition:CGPoint = sender.convert(.zero, to: self.collectionView)
    let indexPath:IndexPath = self.collectionView.indexPathForItem(at: buttonPosition)!
    onAddBlueCircle(indexPath: indexPath)
}
like image 38
Trần Thị Diệu My Avatar answered Nov 04 '22 05:11

Trần Thị Diệu My