Developer
Developer

Reputation: 832

UICollectionVIew indexPath.item/row returning incorrect value

Here is the code that I have written for UICollectionView. In this UICollectionView I'm using a UIButton and I want to know the index of cell from where the button was clicked. On button tap the value of indexPath.item/row is varying, I'm not getting the correct value.

 - (void)viewDidLoad 
{
    [super viewDidLoad];
    UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
    frpCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:layout];
    [frpCollectionView setDataSource:self];
    [frpCollectionView setDelegate:self];

    layout.minimumInteritemSpacing = 0;
    layout.minimumLineSpacing = 0;
    frpCollectionView.backgroundColor=[UIColor whiteColor];
    [frpCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];

    [self.view addSubview:frpCollectionView];
    [frpCollectionView mas_makeConstraints:^(MASConstraintMaker *make) 
    {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.view);
        make.bottom.equalTo(self.view);
    }];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return frpTitleArray.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    frpCollectionViewCell = [frpCollectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
    frpCollectionViewCell.layer.borderWidth=0.25f;
    frpCollectionViewCell.layer.borderColor=[UIColor lightGrayColor].CGColor;

    UIButton *setFrpPriceButton = [UIButton new];
    setFrpPriceButton.backgroundColor = UIColorFromRGB(0x2196f3);
    [setFrpPriceButton setTitle:@"SET PRICE" forState:UIControlStateNormal];
    [setFrpPriceButton addTarget:self action:@selector(setFrpPriceClick) forControlEvents:UIControlEventTouchUpInside];
    setFrpPriceButton.tag = selectedCellIndex;

    [frpCollectionViewCell addSubview:setFrpPriceButton];
    setFrpPriceButton.titleLabel.font = [UIFont boldSystemFontOfSize:10];
    setFrpPriceButton.clipsToBounds = YES;

    [setFrpPriceButton mas_makeConstraints:^(MASConstraintMaker *make)
    {
        make.top.equalTo(frpButtonLabel);
        make.width.equalTo(frpCollectionViewCell).dividedBy(3);
        make.right.equalTo(frpCollectionViewCell);
        make.height.equalTo(frpTitleLabel);
     }];
     return frpCollectionViewCell;
}
- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)displaySpecialityCollectionView
{
    return 1;
}

- (CGSize)collectionView:(UICollectionView *)displaySpecialityCollectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(self.view.frame.size.width, self.view.frame.size.height/2);
}

-(UIEdgeInsets)collectionView:(UICollectionView *)displaySpecialityCollectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(0,0,0,0);
}

- (void)collectionView:(UICollectionView *)displaySpecialityCollectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    selectedCellIndex = (int)[indexPath row];
}

Upvotes: 0

Views: 1429

Answers (2)

Nirmit Dagly
Nirmit Dagly

Reputation: 1492

Just change this line in "cellForRowAtIndexPath" method:-

Change

setFrpPriceButton.tag = selectedCellIndex;

to

setFrpPriceButton.tag = indexPath.row;

Also, access button's click event in method "setFrpPriceClick" like this:-

-(void)setFrpPriceClick:(id)sender {
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[sender tag] inSection:0];
    NSLog(@"row number is %@",indexPath.row);
}

Upvotes: 1

Pantelis Proios
Pantelis Proios

Reputation: 1369

You should subclass your cell instead of recreating it each and every time. But anyway, try:

[setFrpPriceButton addTarget:self action:@selector(setFrpPriceClick:) forControlEvents:UIControlEventTouchUpInside];
setFrpPriceButton.tag = indexPath.row;

Your method should look this:

    -(void)setFrpPriceClick:(id)sender {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[sender tag] inSection:0];
        NSLog(@"row number is %@",indexPath.row);
    }

Upvotes: 0

Related Questions