Реализация нескольких типов UITableViewCell

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Я создаю пользовательский класс cell, в котором я помещаю различные типы вложенных представлений в свой метод инициализации, но с фреймом как CGRectZero.

 self.subTitleLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];[self.contentView addSubview:self.subTitleLabel];

self.scannedProductLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.scannedProductLabel];

self.requestStatusLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.requestStatusLabel];
  

В моем методе layoutSubviews я использую эти метки в зависимости от моих потребностей. Например, для одного типа ячеек я буду использовать первую метку, а для другого типа — другую метку.

 if ([self.cellType isEqualToString:@"CustomerDetails"] ) {
        //self.productImageView.frame = CGRectMake(aContentRect.origin.x   kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/4));
        self.titleLabel.frame = CGRectMake(aContentRect.origin.x   kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/2));
        self.subTitleLabel.frame = CGRectMake(aContentRect.origin.x   kCellOffset, floorf(aHeight/2), aTitleCellWidth, floorf(aHeight/4));
        self.requestStatusLabel.frame = CGRectMake(aContentRect.origin.x   kCellOffset, floorf((aHeight/2)   (aHeight/4)), aTitleCellWidth , floorf(aHeight/4));
    }
  

Мой вопрос в том, что это хорошая идея сделать это с точки зрения памяти. Как будто моя цель решена, но мой пользовательский объект cell содержит вложенные представления, которые находятся в памяти, но не видны. Если да, то каков альтернативный подход для такого сценария.

Ответ №1:

Если не все вложенные представления будут использоваться для каждого типа ячейки, я предлагаю лениво создавать каждое вложенное представление при первом обращении к нему. Это может быть достигнуто путем переопределения его средства получения следующим образом:

 - (UILabel)subTitleLabel {
    if (subTitleLabel == nil) {
        subTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(kSubTitleX, kSubTitleY, kSubTitleWidth, kSubTitleHeight)];
        [self.contentView addSubview:subTitleLabel];
    }
    return subTitleLabel;
}
  

Таким образом, subTitleLabel создается и добавляется в представление содержимого при первом обращении к нему через средство получения. Если вы никогда не вызываете средство получения, например, потому что тип ячейки этого не требует, оно self.subTitleLabel никогда не будет вызвано и subTitleLabel никогда не будет создано.

Ответ №2:

Я бы не подумал, что проблемы с памятью здесь будут такой большой проблемой. Если вы правильно повторно используете ячейки, то вы, вероятно, создаете только 5-10 ячеек в своем списке, которые постоянно перерабатываются.

Хотя одним из альтернативных решений было бы использовать celltype в качестве идентификатора повторного использования и создавать только те подвиды, которые необходимы для этого типа. Таким образом, когда вы получаете ячейку для определенного типа, вы знаете, что в ней будут только обязательные поля. Это может привести к созданию большего количества ячеек, которые на самом деле могут занимать больше памяти.