Как установить UILabel в UICollectionViewCell
У меня есть приложение с UIViewController с UICollectionView IBOutlet в нем.
Ячейка в UICollectionView - это MyCustomCell, и этот метод устанавливает ее UILabel:
-(void)setCellLabel:(NSString *)value{
NSLog(@"settinglabel");
cellLabel.text = @"hardcode"; //added for testing purposes
}
Ячейка имеет тип свойства Class, идентифицирующий ее как MyCustomCell в раскадровке, а также идентификатор ее очереди. UIViewController принимает источники данных и протоколы делегатов. У выхода IBOutlet UILabel есть выход cellLabel, подключенный к раскадровке. Методы определены как:
- (void)viewDidLoad{
[super viewDidLoad];
self.restNames = @[@"Orange",@"Naranja",@"Narnia"];
[self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"MyCustomCellID"];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
NSLog(@"%d",[self.restNames count]);
return [self.restNames count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
[cell setCellLabel:@"hi"];
NSLog(@"fitsname %@",[self.restNames objectAtIndex:indexPath.row]);
return cell;
}
Я получаю три ячейки в моем виде таблицы, соответствующие 3 объектам в моем массиве. Массив просто содержит строковые объекты, которые я устанавливал непосредственно с помощью objectAtIndexPath, но я решил установить его непосредственно в @"hi", так как он не работал. Я даже изменил значение, используемое в методе setCellLabel, на жестко закодированное значение, и я продолжаю получать только строку "Метка" по умолчанию в каждой ячейке.
Почему cellLabel не настроен правильно?
3 ответа
У вас есть выход cellLabel, установленный в конструкторе интерфейсов?
У вас должно быть что-то вроде этого в файле.h вашей ячейки:
@property (weak, nonatomic) IBOutlet UILabel *cellLabel;
тогда позже вам действительно нужно сделать это:
cell.cellLabel.text = @"";
Когда вы используете раскадровку, шаблон по умолчанию является неправильным, потому что он использует строку
[self.collectionView registerClass:[UICollectionView class] forCellWithReuseIdentifier:CellIdentifier];
Но раскадровка уже зарегистрировала это. Так что в основном это то, что вам нужно сделать, чтобы создать пользовательскую раскадровку на основе UICollectionView
:
- Создайте свой
UICollectionViewController
подкласс - Нажмите и перетащите
UICollectionViewController
на раскадровку и измените конфигурацию, как вы хотите - Создать
UICollectionViewCell
подкласс - Установите класс ячейки в раскадровке, установите идентификатор для повторного использования.
- Удалить
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier: CellIdentifier];
- Установите статический идентификатор повторного использования в
UICollectionView
подкласс
Вы, вероятно, забыли рассказать своим UICollectionView
какой класс он должен использовать для создания ячеек. Это делается с помощью следующей строки кода:
[self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier: CellIdentifier];
Вы можете установить это в конце viewDidLoad вашего контроллера.