#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:
использовалась на разных кнопках, поэтому на одной кнопке не использовалось несколько целевых селекторов. По-видимому, цель переносится за счет повторного использования удаления из очереди.