2013-07-01 3 views
4

У меня есть пользовательский UICollectionViewCell, который имеет пользовательский фоновый вид, который нарисован с использованием одной из нескольких цветовых схем. Цветовая схема для фонового представления задана в моем пользовательском инициализаторе -(id)initWithFrame:andColourPalette: для представления.Инициализация пользовательского UICollectionViewCell

У меня есть подобный пользовательский Инициализатор в моем UICustomViewCell подкласса, но я не могу понять, как назвать этот Инициализатор, когда я настройка ячейки в cellForItemAtIndexPath:

Может кто-нибудь помочь мне сделать это? Или предложите альтернативное решение для передачи этого Словаря цветов в ячейку, чтобы перейти к subView?

EDIT, чтобы показать более подробно:

Это то, что у меня в UICollectionView VC:

В ViewWillAppear:

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 
self.colourPalette = [OPOColourPalette greenyColourPalette]; 

В cellForItemAtIndexPath:

UICollectionViewCell *cell   = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_ID forIndexPath:indexPath]; 
OPOLawCollectionViewCell *lawCell = (OPOLawCollectionViewCell *)cell; 

MainLevel *level     = self.collectionData[indexPath.row]; 
lawCell.delegate     = self; 
lawCell.colourPalette    = self.colourPalette; 

В моем пользовательском UICollectionV iewCell

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // get background view 
     OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:self.colourPalette]; 

Но это не сработает - я думаю, потому что свойства не настроены.

Если изменить последнюю строку на это, то он работает отлично:

OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:[OPOColorPalette greenyColorPalette]]; 

Так я думаю, мне нужно использовать пользовательские intialiser здесь, но я не могу понять, как это назвать, или откуда. ..

Благодаря

ответ

12

ЮО должны зарегистрировать customCells в CollectionView:

[self.collectionView_ registerClass:[YourCustomClass class] 
     forCellWithReuseIdentifier:@"CustomCell"]; 

А потом в методе cellForItemAtIndexPath:

YourCustomClass *cell = (YourCustomClass *)[collectionView 
     dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; 

Это делается потому, что CollectionView может иметь 1000 ячеек и 10 видимую. Вы не сохраняете их инициализацию и повторное использование, когда это возможно.

EDIT

Вы должны установить colorPaletter после DEQUE многократного использования клетки. Подумайте об этом как о контейнере, который может содержать любой цвет. Вам нужно определить (по указателю), какой цвет для рисования.

+0

Я делаю это уже, но мне нужно сообщить ячейке, какой цвет рисовать фоновой графикой. Если я поместил свойство в ячейку для colourPalette, а затем установил его в cellForItemAtIndexPath: это не работает, потому что свойство не настроено до того, как ячейка рисует его фон. Поэтому я думаю, что мне нужно переопределить initWithFrame: поэтому он использует мой метод initWithFrame: andColourPalette:. – Bertie

+0

Я поставил немного кода в вопросе, чтобы дать более подробно – Bertie

+1

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

2

Вы не должны делать ниже, если пользовательская ячейка находится в Storyboard,

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 

Поскольку Storyboard берет на себя ответственность зарегистрировать Cell_ID собственных. Теперь он будет конфликтовать с созданной недопустимой ячейкой, если вы используете оба.

1

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

Единственный способ сделать это - назначить уникальный идентификатор повторного использования для каждой ячейки на основе того, каким будет значение пути индекса (при условии, что вы будете знать, что это будет - и, в вашем случае, вы это сделаете); то при удалении ячейки используйте указательный путь для поиска ячейки с соответствующим идентификатором повторного использования.

Отмечено ли это для целей повторного использования идентификаторов? Точно нет. Вы будете повторно использовать эту ячейку каждый раз, когда вам нужно будет использовать ее снова. Идентификаторы повторного использования не должны были ограничивать вас ячейкой куки-кучера для каждой ячейки в вашем представлении коллекции; они также должны быть идентификаторами «уникального использования».

Смежные вопросы