#ios #objective-c #swift #oop #uicollectionview
#iOS #objective-c #swift #ооп #uicollectionview
Вопрос:
У меня есть два пользовательских UICollectionViewCell
класса, однако я хочу создать из них переменную с тем же именем в той же области, потому что все свойства и весь код в cellForItemAtIndexPath
методе одинаковы для обеих пользовательских ячеек.
Я хочу сделать что-то вроде этого: например:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
CustomCell1/CustomCell2 *cell;
if (condition) {
cell = (CustomCell1 *)[collectionView dequeueReusableCellWithReuseIdentifier:kCustomCell1Identifier forIndexPath:indexPath];
} else {
cell = (CustomCell2 *)[collectionView dequeueReusableCellWithReuseIdentifier:kCustomCell2Identifier forIndexPath:indexPath];
}
// Remaining code is same for both custom cells
cell.property1 = value1;
cell.property2 = value2;
.
.
.
.
.
//lot of code
cell.property100 = value100;
return cell;
}
Моя цель заключается в том, что я не хочу повторять весь оставшийся код. Я знаю, что решением может быть создание общего пользовательского класса ячеек и запись этого условия в этом общем классе, но в этом случае как я могу передать переменную условия в пользовательский класс до инициализации этого класса. Потому что я думаю, что мы не можем инициализировать (alloc init) UICollectionViewCell.
Возможно ли это с помощью условного (троичного) оператора?
Комментарии:
1. Используйте базовый класс и добавьте в него общие методы и извлеките ячейки из этого класса. Это решит вашу проблему.
2. Может работать подкласс или протокол. И когда я вижу
cell.propertyN = valueN
, где N от 0 до 100, я бы предложил создать метод, который будет делать это с объектом (NSArray ? NSDictionary) внутри ячейки.3. @Larme Я привел cell.propertyN = valueN просто в качестве примера. На самом деле, существует много кода, такого как назначение изображений, скрытие и отображение разных вложенных представлений, изменение цветов и т.д.
4. Я думаю, комментарий @Shaileschandavar поможет вам.
5. Почему вы создали одни и те же классы с одинаковыми свойствами? Идентичны ли эти два класса? Если это не так, пожалуйста, создайте родительский класс с общим ivar и методами, а затем создайте дочерние классы, наследующие родительский класс
Ответ №1:
Вы можете создать базовый (родительский) класс CollectionViewCell
@interface BaseCollectionViewCell : UICollectionViewCell
//Add the common methods(can add common IBOulet and IBAction) and implement them.
@end
Теперь вы можете создать новую ячейку представления коллекции, которая является производной от BaseCollectionViewCell как:
@interface ChildCell : BaseCollectionViewCell
//add methods which are specific to the ChildCell as the methods of
//BaseCollectionViewCell is already available via inheritance.
@end
таким же образом вы можете создать другую ячейку представления коллекции как:
@interface ChildCell2 : BaseCollectionViewCell
//add methods which are specific to the ChildCell2 as the methods of
//BaseCollectionViewCell is already available via inheritance.
@end
Теперь ChildCell и ChildCell2 получают все методы BaseCollectionViewCell .
Зарегистрируйте ячейки представления вашей коллекции в этих классах вместе с отдельным идентификатором повторного использования. Используйте следующий код для удаления ячейки из очереди.
BaseCollectionViewCell *cell;
if (condition) {
ChildCell *cell1 = (ChildCell *)[collectionView
dequeueReusableCellWithReuseIdentifier:kCustomCell1Identifier
forIndexPath:indexPath];
//call cell1's specific properties if needed.
cell = (BaseCollectionViewCell *) cell1;
} else {
ChildCell2 cell2 = (ChildCell2 *)[collectionView
dequeueReusableCellWithReuseIdentifier:kCustomCell2Identifier forIndexPath:indexPath];
//call cell2's specific properties if needed.
cell = (BaseCollectionViewCell *) cell2;
}
//call common methods here.
Комментарии:
1. Не могли бы вы также добавить, как код будет находиться в методе cellForItemAtIndexPath, как я написал в вопросе?
2. BaseCollectionViewCell * cell; с его помощью да, вы можете получить доступ к общему свойству в обеих ячейках, но как насчет других, например, дочерняя ячейка1 имеет одну метку с именем titleLabel , поэтому cell.titleLabel теперь недоступен, потому что он не является частью BaseCollectionViewCell надеюсь, вы поняли мою точку зрения
3. @Mikealter Мы можем привести ячейку к определенным свойствам ячейки. Я добавил комментарий.