Ошибка UICollectionViewReusableView: выбор одного заголовка иногда вызывает другой

#ios #uibutton #uicollectionview #uicollectionviewcell #uicollectionreusableview

#iOS #uibutton #uicollectionview #uicollectionviewcell #uicollectionreusableview

Вопрос:

UICollectionViewReusableView Ошибка: выбор одного заголовка иногда вызывает другой заголовок

UICollectionView содержит 2 раздела. У каждого есть заголовок с кнопкой, которая изменяет BOOL состояние либо textDeleteActive , либо imageDeleteActive , затем перезагружает раздел. Они используются, чтобы показать, скрыта ли кнопка удаления в каждой ячейке или нет. Но если я чередую и, после нажатия одной кнопки, касаюсь другой, то, похоже, это связывает их. Впоследствии нажатие второй кнопки вызывает изменение обоих BOOL переменных. Это устраняется, только если снова коснуться первой кнопки, чтобы каким-то образом разорвать ее связь. Я не могу понять, почему или как существует ссылка.

Код (с удалением большинства несвязанных кодов):

Оба UICollectionReusableView представления заголовка и обе UICollectionViewCell ячейки имеют @property (nonatomic, strong) IBOutlet deleteButton . Конечно, у каждого из них есть фактический UIButton.

myUICollectionViewController:

 @property (nonatomic) BOOL textDeleteActive;
@property (nonatomic) BOOL imageDeleteActive;

- (void)TextHeaderDeleteButtonDynamicHandler
{
    NSLog(@"texthead");
    self.textDeleteActive = !self.textDeleteActive;
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:1]];
}
- (void)ImageHeaderDeleteButtonDynamicHandler
{
    NSLog(@"imagehead");
    self.imageDeleteActive = !self.imageDeleteActive;
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    long fRow = [indexPath row];
    switch ([indexPath section]) {
        case 0:
            if (true) {

                HCSShortCutTextViewCell *theCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyShortCut" forIndexPath:indexPath];


                if (self.imageDeleteActive) {
                    theCell.deleteButton.hidden = NO;
                } else {
                    theCell.deleteButton.hidden = YES;
                }


                [theCell.deleteButton addTarget:self action:@selector(ImageCellDeleteButtonDynamicHandler:event:) forControlEvents:UIControlEventTouchUpInside];
                return theCell;
            }
            break;
        case 1:
            if (true) {

                HCSCustomViewCell *theCustCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCustom" forIndexPath:indexPath];

                //no image

                if (self.textDeleteActive) {
                    theCustCell.deleteButton.hidden = NO;
                } else {
                    theCustCell.deleteButton.hidden = YES;
                }


                [theCustCell.deleteButton addTarget:self action:@selector(TextCellDeleteButtonDynamicHandler:event:) forControlEvents:UIControlEventTouchUpInside];
                return theCustCell;
                }
            break;
        default:
            return nil;
            break;
    }
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    //handled by the storyboard segue
}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    if (kind == UICollectionElementKindSectionHeader) {
        switch ([indexPath section]) {
            case 0:
                if (true) {
                    HCSMyHeaderReusableView *theCell = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
                    theCell.titleLabel.text = @"Image Shortcuts";
                    NSLog(@"ima");
                    [theCell.deleteButton addTarget:self action:@selector(ImageHeaderDeleteButtonDynamicHandler) forControlEvents:UIControlEventTouchUpInside];
                    return theCell;
                }
                break;
            case 1:
                if (true) {
                    HCSMyHeaderReusableView *theCell = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
                    theCell.titleLabel.text = @"Text Shortcuts";
                    NSLog(@"tex");
                    [theCell.deleteButton addTarget:self action:@selector(TextHeaderDeleteButtonDynamicHandler) forControlEvents:UIControlEventTouchUpInside];
                    return theCell;
                }
                break;
            default:
                return nil;
                break;
        }
    } else
        return nil;
}



- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //set defaults
    self.textDeleteActive = NO;
    self.imageDeleteActive = NO;
}

- (void)TextCellDeleteButtonDynamicHandler:(id)sender event:(id)event
{
    NSLog(@"textcell");
    [self deleteItemAndReloadCollectionView:sender event:event defaultsKey:@"textShortcuts"];
}
- (void)ImageCellDeleteButtonDynamicHandler:(id)sender event:(id)event
{
    NSLog(@"imagecell");
    [self deleteItemAndReloadCollectionView:sender event:event defaultsKey:@"shortcuts"];

}
  

Ответ №1:

Исправлено с помощью взлома. Создал две кнопки удаления, и для каждой из них отображалась только одна, так что addTarget: использовалась на разных кнопках, поэтому на одной кнопке не использовалось несколько целевых селекторов. По-видимому, цель переносится за счет повторного использования удаления из очереди.