1

我的问题有点奇怪,假设我有一个继承自 UITableViewCell 的类,称为 GenericTableViewCell,还有一些继承自 GenericTableViewCell 的类。我希望能够将一个参数传递给 GenericTableViewCell init 方法,该方法将告诉我 GenericTableViewCell 的哪个子类应该将此 TableViewCell 初始化为。这是我的想法,但我知道它会失败,因为它有一个递归循环。

@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 回答
2

您应该实现的东西称为类集群模式。在您的情况下,您不应该调用initWithStyle:reuseIdentifier:子类而不是子类的初始化程序:

GenericTableViewCell

- (id)initWithCustomIdentifier:(NSString *identifier) {
    Class cellClass = NSClassFromString(identifier);

    if (!cellClass) {
        cellClass = [MyStandardTableViewCell class];
    }
    self = [[cellClass alloc] init];

    return self;
}

MyStandardTableViewCell(或任何其他子类GenericTableViewCell

- (id)init {
    self = [super initWithStyle:someStyle reuseIdentifier:NSStringFromClass([self class])];

    if (!self) return nil;

    // do extra setup here
    return self;
}
于 2012-05-23T09:19:42.097 回答