0

Я пытаюсь создать пользовательский UICollectionViewCell, который содержит несколько свойств и зависит от значений этих свойств, составляющих компоненты внутри ячейки. Я использую dequeueReusableCellWithReuseIdentifier для создания ячейки, затем устанавливаю некоторые свойства и в конце вызываю функцию layoutIfNeeded, которая переопределяется внутри моей настраиваемой ячейки. Переопределенная функция устанавливает некоторые свойства ячейки, также, например, свойство BOOL установлено в YES, и после обновления ячейки (вызов reloadData в режиме просмотра) функция layoutIfNeeded вызывается снова. Когда я пытаюсь прочитать мое свойство BOOL, которое установлено в YES, я всегда получаю значение по умолчанию, которое НЕТ в первый раз, я звоню reloadData. Когда я вызываю reloadData второй раз, свойство имеет значение YES. Любая идея, что я делаю неправильно? Вот код, я использую:UICollectionViewCell неправильно задает свойства

кнопку мыши Я зову:

[myCollectionView reloadData]; 

метод cellForItemAtIndexPath выглядит следующим образом:

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath]; 
cell.device = [collectionArray objectAtIndex:indexPath.row]; 
[cell layoutIfNeeded]; 
return cell; 

И код layoutIfNeeded внутри MyCustomCollectionCell.m

-(void)layoutIfNeeded{ 
    NSLog(@"bool prop: %d",changedStatus); 
    changedStatus = YES; 

} 

Свойство BOOL определено в MyCustomCollectionCell.h:

@property (nonatomic, assign)BOOL changedStatus; 

UPDATE:

Я сожалею, что я сделал ошибку в моем посте. Я не освежаю коллекцию с reloadData, но с reloadItemsAtIndexPaths; Этот вызов заставляет снова вызвать метод init моей настраиваемой ячейки (не только при первом загрузке коллекции), а затем layoutIfNeeded. Проблема в том, что ячейка не используется повторно, а создается снова, заставляя все свойства исчезать. Любая идея, как это исправить?

+0

Вы можете определить, когда (в связи с вызовом '-reloadData') вы читаете' changedStatus'? –

+0

'reloadData' вызывается внутри класса' viewController', а 'changedStatus' установлен и напечатан внутри' MyCustomCollectionCell'. Сначала называется 'reloadData', затем метод' cellForItemAtIndexPath', внутри этого метода 'layoutIfNeeded', а внутри' layoutIfNeeded' печатается 'changedStatus', а затем устанавливается новое значение. – AleksandarNS

+1

bro я только что создал пустой проект и скопировал ваш код и вставил в свой проект. просто добавила одну строку после @implementation. синтезировать changedStatus. и работал нормально. не знаю почему, но работал. –

ответ

0

Какова цель changedStatus?

установка changedStatus = YES; в layoutSubviews вместо Try:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    self.changedStatus = YES; 
} 
+0

У меня есть более сложная система, которая содержит 5 свойств NSString и 3 свойства BOOL, которые я читаю позже. В зависимости от значений этих 8 свойств различный контент обновляется и отображается, когда пользователь нажимает кнопку. Зачем мне читать его с помощью атрибута self, если применяется @synthesize? – AleksandarNS

+0

@ DuncanC ответ лучший, вы должны работать с вашей моделью вне своих ячеек, которые предназначены для отображения только модели. Аксессуар 'self.' - это просто мой стиль кодирования :) – ryancrunchi

2

Вы не можете использовать ячейки для хранения данных состояния. Клетки используются, помещаются в очередь повторного использования, а затем перерабатываются. Конкретный объект ячейки, который хранит данные для определенной indexPath, может измениться, когда таблица перезагружается, когда ячейка перезагружается, когда вы прокручиваете, чтобы открывать новые ячейки и т. Д.

Сохранение данных состояния в вашей модели данных.

+0

Почему я получаю правильные значения после второго нажатия кнопки? Каждый раз, когда я получаю правильное значение, кроме первого раза. Это не имеет значения, если ячейка видна или нет. Он всегда устанавливается правильно после второго нажатия. – AleksandarNS

0

Установите этот changeStatus Bool внутри вашего ViewController вместо UICollectionViewCell.

Свойство BOOL определено в YourViewController.ч:

@property (nonatomic, assign)BOOL changedStatus; 

Когда вы хотите обновить CollectionView

[myCollectionView reloadData]; 
changedStatus = YES; 

Затем внутри вашего MyCustomCollectionCell.m создать новый метод, как,

-(void)customLayoutIfNeeded : (BOOL)status{ 
    NSLog(@"bool prop: %d",changedStatus); 
    changedStatus = YES; 

} 

Добавьте к этому MyCustomCollectionCell.h, а также.

Тогда внутри cellForItemAtIndexPath сделать это,

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath]; 
cell.device = [collectionArray objectAtIndex:indexPath.row]; 
[cell customLayoutIfNeeded: changedStatus]; 
return cell;