2012-04-23 2 views
0

Поэтому у меня есть следующий код:добавляющих подвиды к клеточному contentView

static NSString *CellIdentifier = @"RecommendationCell"; 

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

    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [indicator setCenter:CGPointMake(0, 15)]; 
    [indicator startAnimating]; 
    [indicator hidesWhenStopped]; 

    UILabel *someLabel......... 


    UIView *containerView = [[UIView alloc] initWithFrame:CGRectZero]; 
    [containerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
    [containerView setAutoresizesSubviews:YES]; 
    [containerView setBackgroundColor:[UIColor clearColor]]; 
    [containerView addSubview:indicator]; 
    [containerView addSubview:someLabel]; 
    [containerView setFrameSize:CGSizeMake(indicator.frameWidth+self.loadingGeniusLabel_.frameWidth, 30)]; 
    [containerView setCenter:CGPointMake(cell.contentView.center.x, 15)]; 

    [cell.contentView addSubview:containerView]; 

    [indicator release]; 
    [containerView release]; 

    return cell; 

Мой вопрос, является выше кодом эффективным/чистым? Причина, по которой я спрашиваю, состоит в том, что если ячейка, которую мы получаем, из многоразовой колоды, то она будет иметь UIActivityIndicator и необходимый вид в ней правильно? Мне просто нужно добавить subviews только в том случае, если я выделяю новую ячейку (т. Е. Когда ячейка == nil)?

ответ

1

- код выше эффективный/чистый?

Нет

если ячейка, что мы получаем от многократного использования колоды, то это будет иметь UIActivityIndicator и необходимый вид в нем правой

Да, но так как вы используя общий UITableViewCell, вы не сможете получить доступ к UIActivityIndicator после добавления его один раз. Вам нужно создать подкласс UITableViewCell, чтобы сделать это эффективно.

Нужно ли просто добавлять подвыборы только в том случае, если я выделяю новую ячейку (например, когда ячейка == nil)?

Да

Вызывайте addSubview вне если (ячейки == ноль) блокировать, если вы абсолютно необходимо, это дорогой способ вызова и будет серьезно влиять на ваши кадров в секунду при прокрутке таблицы.

Ваш лучший выбор - подклассификация UITableViewCell. Таким образом, любые объекты/UIViews (или подклассы UIView), которые вам необходимы для управления значением/поведением по-разному от ячейки к ячейке, лучше подходят как свойства в подклассе UITableViewCell. Делая это, вы можете создавать их либо в файле xib, либо в настройке ячейки (внутри этого оператора if), а затем просто изменять значения для каждой ячейки (а не создавать новые объекты каждый раз).

Просмотр таблицы Руководство по программированию от Apple обсуждает это в глубине: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html#//apple_ref/doc/uid/TP40007451

пример проект компании Apple показывает несколько различные способы для управления ячейками таблицы эффективно: https://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html

+0

хорошо .. вещь, почему я не использую подкласс - это потому, что в представлении таблицы будет только один тип ячейки, остальные ячейки используют одну другую ячейку. – xonegirlz

+0

Хм, так буквально, будет только одна ячейка в таблице, как это? В этом случае ваш код может быть приемлемым, но определенно не оптимальным. Я предполагаю, что код, который вы опубликовали, окружен более крупным оператором if, чтобы определить, показывать ли рекомендательное письмо, что показывать? –

+0

Тем не менее, я бы включил подклассификацию UITableView, хотя бы для одной ячейки. Это несколько минут кодирования, обеспечивает большую гибкость и не имеет недостатков. –