2

さまざまなジェスチャーと統計動作を処理するかなり大きな UITableViewCell サブクラスがあります。私は UICollectionView も構築しています。私の UICollectionViewCell サブクラスの動作は、私の UITableViewCell にかなり近いものです。そこからたくさんのコードを貼り付けました。

私の質問は: UI コード (ジェスチャーと状態) をこれら 2 つのサブクラス間で共有できるデザイン パターンはありますか?

構成パターンは聞いたことがありますが、今回のケースに当てはめるのに苦労しました。使用する正しいパターンですか?

注: UITableView と UICollectionView の両方を保持する必要があるため、UITableView を削除することは解決策ではありません。

4

1 に答える 1

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

2 つは共通のメソッド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

セル実装ファイルにカテゴリ ヘッダーをインポートし、メソッド実装を削除するようになりました。そこから、カテゴリの共通メソッドを使用できます。複製する必要があるのは、プロパティ宣言だけです。

于 2014-02-27T07:51:34.830 に答える