我有一个非常大的UITableViewCell子类,它处理各种手势和统计行为。 我也在构建一个UICollectionView,我的UICollectionViewCell子类行为非常接近我的UITableViewCell。我已经粘贴了很多代码。
我的问题是:是否有一种设计模式可以让我在这两个子类之间共享UI代码(手势和状态)?
我听说过构图模式,但我很难适应这种情况。这是正确的使用模式吗?
注意:我必须同时保留UITableView和UICollectionView,因此删除UITableView不是解决方案。
答案 0 :(得分:4)
我认为,你可以在他们共同的祖先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
现在在单元格实现文件中导入类别标头并删除方法实现。从那里你可以使用类别中的常用方法。 你唯一需要复制的是属性声明。