在UITableViewCell和UICollectionViewCell之间共享代码

时间:2013-04-02 07:47:20

标签: ios objective-c design-patterns uitableview uicollectionviewcell

我有一个非常大的UITableViewCell子类,它处理各种手势和统计行为。 我也在构建一个UICollectionView,我的UICollectionViewCell子类行为非常接近我的UITableViewCell。我已经粘贴了很多代码。

我的问题是:是否有一种设计模式可以让我在这两个子类之间共享UI代码(手势和状态)?

我听说过构图模式,但我很难适应这种情况。这是正确的使用模式吗?

注意:我必须同时保留UITableView和UICollectionView,因此删除UITableView不是解决方案。

1 个答案:

答案 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

现在在单元格实现文件中导入类别标头并删除方法实现。从那里你可以使用类别中的常用方法。 你唯一需要复制的是属性声明。