Общий код между UITableViewCell и UICollectionViewCell

У меня есть довольно большой подкласс UITableViewCell, который обрабатывает различные жесты и поведение статистики. Я также создаю UICollectionView, поведение моего подкласса UICollectionViewCell довольно близко к моему UITableViewCell. Я вставил много кода из него.

Мои вопросы: существует ли шаблон проектирования, который позволил бы мне использовать код пользовательского интерфейса (жест и состояние) для этих двух подклассов?

Я слышал о шаблоне композиции, но мне трудно подобрать его для этого случая. Это правильный шаблон для использования?

Примечание. Я ДОЛЖЕН сохранить как UITableView, так и UICollectionView, поэтому удаление UITableView не является решением.


person Dimillian    schedule 02.04.2013    source источник


Ответы (1)


Я думаю, вы можете использовать категорию на их общем предке UIView. Вы можете использовать только общие методы, а не переменные экземпляра.

Давайте посмотрим, как его использовать.

Например, у вас есть собственный UITableViewCell.

@interface PersonTableCell: UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *personNameLabel;
- (void)configureWithPersonName:(NSString *)personName;
@end

@implementation PersonTableCell
- (void)configureWithPersonName:(NSString *)personName {
    self.personNameLabel.text = personName;
}
@end

И UICollectionViewCell

@interface PersonCollectionCell: UICollectionViewCell
@property (nonatomic, weak) IBOutlet UILabel *personNameLabel;
- (void)configureWithPersonName:(NSString *)personName;
@end

@implementation PersonCollectionCell
- (void)configureWithPersonName:(NSString *)personName {
    self.personNameLabel.text = personName;
}
@end

Два общих метода configureWithPersonName: для их предка UIView позволяют создать категорию.

@interface UIView (PersonCellCommon)
@property (nonatomic, weak) IBOutlet UILabel *personNameLabel;
- (void)configureWithPersonName:(NSString *)personName;
@end

@implementation UIView (PersonCellCommon)
@dynamic personNameLabel; // tell compiler to trust we have getter/setter somewhere
- (void)configureWithPersonName:(NSString *)personName {
    self.personNameLabel.text = personName;
}
@end

Теперь импортируйте заголовок категории в файлы реализации ячеек и удалите реализации методов. Оттуда вы можете использовать общий метод из категории. Единственное, что вам нужно продублировать, это объявления свойств.

person Community    schedule 27.02.2014
comment
Было бы полезно, если бы вы добавили несколько примеров;) - person PaperBirdMaster; 27.02.2014