Как я могу иметь два пользовательских класса UICollectionViewCell с одинаковым именем переменной

#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 Мы можем привести ячейку к определенным свойствам ячейки. Я добавил комментарий.