Как мне добавить Subview к cell.contentView? - PullRequest
25 голосов
/ 16 августа 2010

A (когда ячейка создается заново):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        CGRect frame = CGRectMake(0, 0, 160, 50);
        UILabel *label = [[UILabel alloc] initWithFrame:frame];
        label.textAlignment = UITextAlignmentRight;
        label.text = @"9:00am";
        [cell.contentView addSubview:label];
        [label release];
    }

    return cell;
}

или B (каждый раз, когда ячейка найдена):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];    
    }

    CGRect frame = CGRectMake(0, 0, 160, 50);
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.textAlignment = UITextAlignmentRight;
    label.text = @"9:00am";
    [cell.contentView addSubview:label];
    [label release];

    return cell;
}

А или Б? Спасибо!

ОБНОВЛЕНИЕ Решение (спасибо за ответы):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    static NSString *CellIdentifier = @"Cell";    
    UILabel *label;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        CGRect frame = CGRectMake(0, 0, 160, 50);
        label = [[UILabel alloc] initWithFrame:frame];
        label.textAlignment = UITextAlignmentRight;
        label.tag = 1;
        [cell.contentView addSubview:label];
        [label release];
    } else {
        label = (UILabel *) [cell viewWithTag:1];
    }

    label.text = [NSString stringWithFormat:@"%d", [indexPath row]];

    return cell;
}

Ответы [ 2 ]

11 голосов
/ 16 августа 2010

Все дело в производительности. С A вы повторно используете ячейку со всеми ее подпредставлениями, с B вы повторно используете только необработанную ячейку и добавляете новое подпредставление при каждой итерации, что, IMHO, не так хорошо, как A re: performance.

Я говорю, либо создайте UITableView подкласс, либо используйте решение A.

11 голосов
/ 16 августа 2010

Вы должны добавлять подвиды только тогда, когда создаете ячейку как в A, однако присваивайте значения меткам и т. Д. Каждый раз, как в B.

Это решение естественно выпадет, если вы создадите свой собственныйподкласс UITableViewCell, который добавляет свои собственные подвиды.

Как-то так.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        CGRect frame = CGRectMake(0, 0, 160, 50);
        UILabel *label = [[UILabel alloc] initWithFrame:frame];
        label.textAlignment = UITextAlignmentRight;
        [cell.contentView addSubview:label];
        [label release];
    }

    // Get a reference to the label here

    label.text = @"9:00am";

    return cell;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...