UICollectionVIew indexPath.item/row возвращает неверное значение

Вот код, который я написал для UICollectionView. В этом UICollectionView я использую UIButton и хочу узнать индекс ячейки, из которой была нажата кнопка. При нажатии кнопки значение 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];
}

person Developer    schedule 17.06.2016    source источник
comment
Добавьте код метода setFrpPriceClick.   -  person Nirav D    schedule 17.06.2016
comment
Почему вы устанавливаете setFrpPriceButton.tag = selectedCellIndex; вместо setFrpPriceButton.tag = indexPath.row;   -  person Jayesh Thanki    schedule 17.06.2016
comment
NSLog(@номер строки равен %@,setFrpPriceButton.tag);   -  person Developer    schedule 17.06.2016
comment
@Jayeshthanki Я тоже пробовал это, но это не работает, я столкнулся с той же проблемой.   -  person Developer    schedule 17.06.2016
comment
в каком методе вы пишете этот код NSLog(@"row number is %@",setFrpPriceButton.tag); ?   -  person Jayesh Thanki    schedule 17.06.2016
comment
Как было сказано ранее: не добавляйте подвид в свою ячейку. Они используются повторно! Почему frpCollectionViewCell является собственностью? Каждый раз, когда вызывается collectionView:cellForItemAtIndexPath:, значение будет другим!   -  person Larme    schedule 17.06.2016
comment
@Larme, не могли бы вы предоставить мне пример кода   -  person Developer    schedule 17.06.2016
comment
setFrpPriceButton.tag = indexPath.row; + удалить @property (zzz) UICollectionViewCell * frpCollectionViewCell; (или ассимилировать) и использовать только UICollectionViewCell *frpCollectionViewCell = [frpCollectionView dequeueReusableCellWithReuseIdentifier:ZzZ Это должно решить некоторые ваши проблемы. По-прежнему существует проблема повторного использования... Нам также нужен код setFrpPriceClick, который явно должен быть setFrpPriceClick: (чтобы получить тег от отправителя).   -  person Larme    schedule 17.06.2016
comment
@Larme я внес эти изменения, но все равно сталкиваюсь с той же проблемой   -  person Developer    schedule 17.06.2016
comment
Вы также изменили подпись setFrpPriceClick? С таким кодом: -(IBAction)setFrpPriceClick:(id)sender{UIButton *button = (UIButton *)sender; NSLog(@"CellRow: %ld", [sender tag];} и ZzZ action:@selector(setFrpPriceClick:) ZzZ?   -  person Larme    schedule 17.06.2016
comment
Как упомянул Ларн, вам нужно перестать создавать новую кнопку каждый раз, когда ячейка используется повторно. Попробуйте проверить contentView ячейки, если кнопка уже присутствует. Если нет, попробуйте создать кнопку программно. Проверьте эту ссылку, может помочь gist.github.com/linktoming/5417543   -  person Nitesh    schedule 17.06.2016
comment
Событие нажатия setFrpPriceButton я пишу этот код   -  person Developer    schedule 17.06.2016


Ответы (2)


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

Сдача

setFrpPriceButton.tag = selectedCellIndex;

to

setFrpPriceButton.tag = indexPath.row;

Кроме того, событие нажатия кнопки доступа в методе «setFrpPriceClick» выглядит следующим образом:

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

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

[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);
    }
person Pantelis Proios    schedule 17.06.2016
comment
Не могли бы вы рассказать мне, как создать подкласс ячейки с образцом кода, если это возможно. - person Developer; 17.06.2016
comment
@CodeGuru вы найдете полезные примеры здесь stackoverflow.com/questions/14530416/ - person Pantelis Proios; 17.06.2016
comment
Фрагменты кода в моем ответе должны работать даже без подклассов. Вы пробовали @CodeGuru? - person Pantelis Proios; 17.06.2016