A classe UITableViewCell fornece diversos atributos essenciais para personalizar a aparência e o cmoportamento das linhas em uma UITableView. A seguir, demonstramos como manipular indicadores de acesso, estilos de seleção e camadas de fundo para aprimorar a interface do usuário.
// Define o ícone padrão no lado direito (seta de detalhe)
celula.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// Utiliza uma interface customizada como acessória (ex: um controle de alternância)
celula.accessoryView = [[UISwitch alloc] init];
// Remove o feedback visual padrão ao tocar na célula
celula.selectionStyle = UITableViewCellSelectionStyleNone;
// Aplica uma cor de fundo sólida diretamente na célula
celula.backgroundColor = [UIColor systemRedColor];
// Configura uma view de fundo customizada para maior controle
UIView *fundo = [[UIView alloc] init];
fundo.backgroundColor = [UIColor systemBlueColor];
celula.backgroundView = fundo;
// Define a aparência visual quando a linha é selecionada pelo usuário
UIView *fundoSelecionado = [[UIView alloc] init];
fundoSelecionado.backgroundColor = [UIColor systemPurpleColor];
celula.selectedBackgroundView = fundoSelecionado;
Estratégias de Reutilização e Desempenho
Para garantir uma rolagem suave (60fps), é crucial minimizar alocações de memória durante a renderização da tabela. O mecanismo de reutilização do iOS funciona mantendo um cache interno (uma fila de objetos) para as células que saíram da tela. Quando o UITableView solicita uma nova célula, o sistema verifica se há objetos disponíveis nesse cache. Caso positivo, o objeto é reconfigurado com os novos dados; caso contrário, uma nova instância é criada. Esse ciclo evita a sobrecarga de criar e destruri objetos repetidamente.
Abordagem Tradicional com Verificação de Nulidade
Neste método clássico, verificamos explicitamente se o cache retornou uma célula válida. Se o retorno for nil, instanciamos a célula manualmente. É recomendado configurar as propriedades estáticas (como fontes ou cores de fundo que não mudam) dentro do bloco de criação.
- (UITableViewCell *)tableView:(UITableView *)tabela cellForRowAtIndexPath:(NSIndexPath *)indice {
// 1. Identificador estático para o tipo de célula
static NSString *const kIdentificadorCelula = @"ItemLista";
// 2. Tenta recuperar uma célula do pool de reutilização
UITableViewCell *celula = [tabela dequeueReusableCellWithIdentifier:kIdentificadorCelula];
// 3. Se não houver células disponíveis no cache, cria uma nova
if (!celula) {
celula = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kIdentificadorCelula];
// Configurações comuns a todas as instâncias deste tipo
celula.backgroundColor = [UIColor secondarySystemBackgroundColor];
}
// 4. Atualização dos dados dinâmicos específicos para a linha atual
celula.textLabel.text = [NSString stringWithFormat:@"Registro #%ld", (long)indice.row];
celula.detailTextLabel.text = @"Detalhes adicionais";
return celula;
}
Abordagem Moderna com Registro de Classe
A técnica recomendada para versões mais recentes do iOS envolve registrar a classe da célula (ou um NIB) no método viewDidLoad. Ao fazer isso, o método dequeueReusableCellWithIdentifier: é garantido para sempre retornar uma instância válida, eliminando a necessidade da verificação if (cell == nil) e simplificendo o código fonte.
static NSString *const kIDRegistro = @"CelulaRegistrada";
- (void)viewDidLoad {
[super viewDidLoad];
// Registra a classe para o identificador especificado
[self.listaTabela registerClass:[UITableViewCell class] forCellReuseIdentifier:kIDRegistro];
}
- (UITableViewCell *)tableView:(UITableView *)tabela cellForRowAtIndexPath:(NSIndexPath *)caminho {
// Recuperação direta da célula (nunca retorna nulo devido ao registro prévio)
UITableViewCell *celula = [tabela dequeueReusableCellWithIdentifier:kIDRegistro forIndexPath:caminho];
// Configuração dos dados
celula.textLabel.text = [NSString stringWithFormat:@"Linha %ld processada", (long)caminho.row];
return celula;
}