0

UITableViewCell をサブクラス化して、左端に 1 つの画像、中央にテキスト、右端にテキストを配置します。

この UITableViewCell サブクラスには、条件に応じて 2 つの画像しかありません。UITableViewCell サブクラスで画像を使用したときに以前に行ったことは、次のように宣言しました

static UIImage *image = nil; 

そして、+(void)initialize私がそれらを割り当てた方法で。これは、画像のクラス インスタンスを持つためだけに作成され、これらの画像を UITableViewCell のすべてのインスタンスに割り当てるためにリソースを使い果たすことはありません。

したがって、私の質問は、メソッドを呼び出している UIViewController の条件に応じて、cellForRowAtIndexPathimageA または imageB で UITableViewCell を表示する必要があるということです。したがって、擬似コードでは次のようになります

if (conditionA) { 
    // Set image of cell to be imageA 
} else { 
    // Set image of cell to be imageB 
}

では、サブクラス化された UITableViewCell でこれを達成するにはどうすればよいでしょうか? UITableViewCell のプロパティを観察する 1 つの方法を考えていました。そのプロパティが変更されると、それに応じてセルの画像を設定しますが、かなり簡単なはずのものが少し肥大化しているように見えますか?

理想的な方法は、UITableViewCell の init メソッドで設定することですが、セルを再利用することはできませんか?

4

3 に答える 3

1

インスタンスごとに冗長なイメージが作成されることを心配する必要はありません。クラスにはすでにキャッシュが組み込まれており、セレクターUIImageを使用して作成している限り、新しいイメージインスタンスは作成されません。imageNamed:

imageNamed:のメソッドのドキュメントからUIImage

このメソッドは、システムキャッシュで指定された名前の画像オブジェクトを探し、そのオブジェクトが存在する場合はそのオブジェクトを返します。一致する画像オブジェクトがまだキャッシュにない場合、このメソッドは指定されたファイルから画像データをロードしてキャッシュし、結果のオブジェクトを返します。

2つの画像が事前定義されていて変更されない場合は、サブクラスセルのインターフェイスを簡略化できます。このサブクラスのユーザーにのみ、どのタイプの画像を使用するかを指示してください。あなたはそのenumために使うことができます。

UITableViewCellのサブクラスヘッダーで、列挙型を作成します。ユースケースに適した名前を使用してください。

typedef enum {
  ImageTypeOne,
  ImageTypeTwo
} ImageType;

@property (nonatomic) ImageType imageType;

実装内で、生成されたセッターを次のようにオーバーライドします。

- (void)setImageType:(ImageType)newImageType {
    imageType = newImageType;

    if (imageType == ImageTypeOne) {
        theImageView.image = [UIImage imageNamed:@"one"];
    } 
    else if (imageType == ImageTypeOne) {
        theImageView.image = [UIImage imageNamed:@"two"];
    }
    // this will resize the image view to fit the image.
    [theImageView sizeToFit];
}

メソッド内cellForRowAtIndexPath:で、条件に応じてこのプロパティを設定するだけです。

if (conditionA) { 
    myCustomCell.imageType = ImageTypeOne;
} else { 
    myCustomCell.imageType = ImageTypeTwo;
}
于 2012-05-28T22:56:02.667 に答える
0

理想的な方法は、UITableViewCell の init メソッドで設定することですが、セルを再利用することはできませんか?

その通りですが、そう遠くないところに解決策があります。2 つの静止画像で同じ手法を使用し、 key プロパティ値に依存するimageViewなどの特別な方法で の画像を更新します。updateMyCellImage

2 番目のステップは、キー プロパティの値が変更された後にこのメソッドを呼び出す、そのキー プロパティのセッターを準備することです。

cellForRowAtIndexPath次に、セルがデキュー/初期化された後にkey プロパティ値を設定するだけで済み、imageViewのイメージが更新され、セルを再利用できます。

于 2012-05-28T22:11:13.297 に答える
0

私はの使用を取得しませんstatic UIImage。ビューはそのデータを所有してはなりません。

これが私だったらUIImage、dataSource のそれぞれに 1 回だけインスタンス化されたプロパティがあり、次に、dataSource に何を表示するかを指示させることで、セルを通常どおりに構成します。

あなたは自分のためにもっと仕事をして、非常に厳格な構造を導入しているようです

于 2012-05-28T22:15:11.113 に答える