2011-12-14 3 views
0

Я пытаюсь вставить некоторые UILabels в первую строку UITableView, но я получаю неожиданные результаты. Ради краткости, вот резюме:Настройка строки 0 UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
NSString* identifier = @"cell"; 
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

if (cell == nil) 
    cell = [[UITableViewCell alloc[ ..... 

cell.textLabel.text = @""; 

if (indexPath.row == 0) { 
    cell.backgroundColor = .... 
    UILabel* x = ..... 
    [x setTag:1]; 
    [cell insertSubview:x]; 
} 
else { 
    cell.textLabel.text = .... 
    for (UIView* view in cell.subviews) { 
     if (view.tag == 1) 
      [view removeFromSuperview]; 
    } 
} 

return cell 

}

Это суть в любом случае. Проблема в том, что, когда цвет фона задан правильно, в любое время, когда я просматриваю представление таблицы, пользовательская вставка UILabel I исчезает. Возможно, это связано с непониманием dequeueReusableCellWithIdentifier, но независимо от того, я бы подумал, что ярлык будет повторно вставлен.

+0

При установке цвет фона ячейки в '-tableView: cellForRowAtIndexPath:' работает большинство время, * официальный * способ сделать это в ['-tableView: willDisplayCell: forRowAtIndexPath:'] (http://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference .html # // apple_ref/ОКК/intfm/UITableViewDelegate/Tableview: willDisplayCell: forRowAtIndexPath :). –

+0

'insertSubview'? это может быть только пример вашего кода, но он помогает быть точным. Просто скопируйте и вставьте реальный код, а затем мы можем точно видеть, что происходит. Вы также должны добавлять представления к содержимому 'contentView' ячейки не прямо к ячейке –

ответ

4

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString* normalCellIdentifier = @"Normal Cell"; 
    static NSString* specialCellIdentifier = @"Special Cell"; 

    if (indexPath.row == 0) { 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:specialCellIdentifier]; 

    if (cell == nil){ 
     cell = [[UITableViewCell alloc[ ..... 
     cell.backgroundColor = .... 
     UILabel* x = ..... 
     [cell insertSubview:x]; 
    } 

    return cell 
    } else { 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:normalCellIdentifier]; 

    if (cell == nil) 
     cell = [[UITableViewCell alloc[ ..... 
    cell.textLabel.text = .... 
    return cell; 
    } 
} 
1

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

Попробуйте это:

/* ARC code */ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    if (0 == indexPath.row) { 
     cell.textLabel.text = @"Zero"; 
     UILabel *lbl = [[UILabel alloc] initWithFrame:(CGRect){.size={80, 20}}]; 
     lbl.backgroundColor = [UIColor redColor]; 
     lbl.textColor = [UIColor blackColor]; 
     lbl.text = @"@@@@"; 
     [cell addSubview:lbl]; 
    } else { 
     cell.textLabel.text = @"Not zero"; 
    }  
    return cell; 
} 

Тогда читайте в другом месте о dequeueReusableCellWithIdentifier:.

Кроме того, для подобных случаев у вас есть - (UIView *)viewWithTag:(NSInteger)tag в UIView и его подклассах, вам не нужно реализовывать свои.

1

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

@ EmilioPelaez имеет одно решение, но единственное, что у меня есть, это то, что код довольно уродлив с повторением и несколькими выходами.

Я был бы гораздо счастливее, делая это, как этот

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *identifier = @"cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    const NSInteger tag = 1; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 
             reuseIdentifier:reuseIdentifier] autorelease]; 
     UILabel *label = [[UILabel alloc] initWithFrame:someFrame]; 
     label.hidden = YES; 
     label.tag = tag; 
     [cell.contentView addSubview:label]; 
     [label release]; label = nil; 
    } 

    cell.textLabel.text = nil; 
    UILabel *label = [cell.contentView viewWithTag:tag]; 

    if (0 == indexPath.row) { 
     cell.backgroundColor = [UIColor greenColor]; 
     label.hidden = NO; 
    } else { 
     cell.backgroundColor = [UIColor redColor]; 
     cell.textLabel.text = @"Some text"; 
     label.hidden = YES; 
    } 

    return cell; 
} 

Думайте об этом как биты между if (!cell) { ... } где вы делаете тяжелую и установить ячейку Tableview в общем виде.

После этого вы просто настраиваете компоненты вида.

Если клетки меняться слишком много, то я, вероятно, рассмотреть возможность с различными идентификаторами повторного использования и, возможно, использовать подкласс UITableViewCell или ее xib

Смежные вопросы