Изменение содержимого UICollectionViewCell и макета пера на основе данных

У меня есть UICollectionView, который отображает множество UICollectionViewCells, которые я сделал подклассом CardCell. Я передаю переменную "type" в CardCell в - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath. Я хочу, чтобы класс CardCell мог загружать другой файл Nib в зависимости от того, какой тип передается. Разные типы должны иметь разные макеты.

Проблема в том, что я не могу понять, где это изменить в моем CardCell.m. Я пробовал использовать - (void)prepareForReuse, но он не вызывает, если пользователь не прокручивает.


person tanner0101    schedule 17.07.2013    source источник
comment
Вы не можете понять, где что изменить?   -  person rdelmar    schedule 18.07.2013
comment
Изменить, какой файл пера загружается для ячейки   -  person tanner0101    schedule 18.07.2013
comment
Вы пробовали использовать разные идентификаторы соты? Вы можете зарегистрировать разные перья для разных идентификаторов, а затем удалить нужную ячейку из очереди из cellForItemAtIndexPath.   -  person architectpianist    schedule 18.07.2013


Ответы (1)


Вы должны зарегистрировать каждый нужный файл пера в viewDidLoad, примерно так (подставляя правильные имена для файла пера и идентификатора):

[self.collectionView registerNib:[UINib nibWithNibName:@"RDCell" bundle:nil] forCellWithReuseIdentifier:@"FirstType"];

Затем в itemForRowAtIndexPath проверьте тип и верните правильный тип ячейки:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        if (type = @"firstType") {
            FirstCell *cell = (FirstCell *) [collectionView dequeueReusableCellWithReuseIdentifier:@"FirstType" forIndexPath:indexPath];
            return cell;
        }else{
            SecondCell *cell = (SecondCell *) [collectionView dequeueReusableCellWithReuseIdentifier:@"SecondType" forIndexPath:indexPath];
            cell.whatever .....
            return cell;
        }
}
person rdelmar    schedule 17.07.2013
comment
У вас проблема с областью действия. ячейка не определяется вне ваших операторов if, поэтому ячейка не будет определена, когда вы перейдете к возврату за пределами любого из операторов if / else. - person Jeremy Hicks; 21.11.2013
comment
@JeremyHicks, когда вы регистрируете перо, dequeueReusableCellWithReuseIdentifier: forIndexPath: гарантированно возвращает ячейку, поэтому нет необходимости в традиционном предложении if (cell == nil). - person rdelmar; 22.11.2013
comment
Но эта ячейка создается внутри оператора if / else, поэтому обратный вызов также должен существовать внутри оператора if / else. Это не так? Я не могу заставить его работать по-другому, когда имею дело с ячейками разных классов. - person Jeremy Hicks; 22.11.2013
comment
@JeremyHicks, да, ты прав, я неправильно понял твой комментарий. Линия возврата ячеек должна быть в каждом предложении. Я исправил свой ответ, чтобы он был правильным. Спасибо за внимание. - person rdelmar; 22.11.2013