0

Вот код, который я написал для UICollectionView. В этом UICollectionView я использую UIButton, и я хочу знать индекс ячейки, с которой была нажата кнопка. При нажатии кнопки значение indexPath.item/row меняется, я не получаю правильное значение.UICollectionVIew indexPath.item/row возвращает неверное значение

- (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]; 
} 
+1

Добавить код 'setFrpPriceClick' метода. –

+1

Почему вы устанавливаете 'setFrpPriceButton.tag = selectedCellIndex;' вместо 'setFrpPriceButton.tag = indexPath.row;' –

+0

NSLog (@ "номер строки% @", setFrpPriceButton.tag); – Developer

ответ

1

Просто измените эту строку в метод "cellForRowAtIndexPath": -

Изменение

setFrpPriceButton.tag = selectedCellIndex; 

к

setFrpPriceButton.tag = indexPath.row; 

Кроме того, нажмите кнопку доступа событие в методе "setFrpPriceClick", как это: -

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

Вы должны подклассифицировать свою ячейку вместо воссоздания ее каждый раз. Но в любом случае, попробуйте:

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

Ваш метод должен выглядеть следующим образом:

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

Не могли бы вы рассказать мне, как подклассу ячейки с образцом кода, если это возможно. – Developer

+0

@CodeGuru вы найдете полезные примеры здесь http://stackoverflow.com/questions/14530416/how-to-create-uicollectionview- no-using-the-storyboard –

+0

Фрагменты кода в моем ответе должны работать даже без подкласса. Вы пытались @CodeGuru? –