1

私の質問はちょっと奇妙です.GenericTableViewCellと呼ばれるUITableViewCellから継承するクラスと、GenericTableViewCellから継承するいくつかのクラスがあるとしましょう。GenericTableViewCell のどのサブクラスがこの TableViewCell を初期化する必要があるかを教えてくれる GenericTableViewCell init メソッドに引数を渡せるようにしたいと考えています。これは私が考えたものですが、再帰ループが含まれているため失敗することはわかっています。

@implementation GenericTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellIdentifier: (CellIdentifier *) identifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        if ([identifier class] == [FirstIdentifier class]){
            self = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier];
        }
        /// more else statements to check for other identifier cases
    }
    return self;
}

@end

これを行う方法はありますか?または、init 関数の外側で識別子を確認し、それによってどのセルを宣言するかを決定する必要がありますか?

4

2 に答える 2

2

はい、できます。これは、クラス クラスターと呼ばれる、ときどき遭遇するパターンです。ARC を使用していない場合は、メモリ リークを防ぐために、self の元の値を解放する必要があります。

しかし、私はこれをしません。でファクトリ メソッドを作成しGenericTableViewCellます。

+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style 
                       reuseIdentifier: (NSString *)reuseIdentifier 
                        cellIdentifier: (CellIdentifier *) identifier
{
    GenericTableViewCell* ret = nil;

    if ([identifier class] == [FirstIdentifier class])
    {
        ret = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier];
    }
    else 
    {
        // ....
    }
    return [ret autorelease];
}

ifメソッドを CellIdentifier に追加し、次のようにサブクラスでオーバーライドすることで、ステートメントを削除できます。

// in CellIdentifier.m

-(id) classForCell
{
    return [GenericTableViewCell class];
} 

// in FirstIdentifier.m

-(id) classForCell
{
    return [FirstTableViewCell class];
}

次に、ファクトリメソッドは次のようになります

+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style 
                       reuseIdentifier: (NSString *)reuseIdentifier 
                        cellIdentifier: (CellIdentifier *) identifier
{
    return [[[[identifier classForCell] alloc] initWithStyle:style 
                                             reuseIdentifier:reuseIdentifier] autorelease];
}
于 2012-05-23T09:17:35.887 に答える