Como definir a cor de fundo para o cabeçalho da seção específica?

Eu tenho um TableView com 10 seções que são carregadas de um arquivo plist e tenho switches com os quais algumas das seções podem ser desativadas. Eu preciso definir uma cor de fundo específica para cada seção com o fato de que a seção pode ser desativada.

Exemplo:

for section Black I need to set black background

for section Red I need to set red background

e assim por diante...

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *tempHeaderView=[[UIView alloc]initWithFrame:CGRectMake(0,0,320,44)];
     tempHeaderView.backgroundColor=[UIColor blackColor];

     [tempHeaderView addSubView: tempHeaderLabel];
     return tempHeaderView;
}
0
adicionado editado
Visualizações: 1
A menos que você esteja usando ARC (Automatic reference counting), seu código está vazando tempHeaderView. Confira minha resposta para uma correção nesse caso.
adicionado o autor Nicolas Miari, fonte
+1 para usar o ARC :)
adicionado o autor Nicolas Miari, fonte
Eu uso o ARC ... obrigado!
adicionado o autor Pavel Kaljunen, fonte

2 Respostas

Mantenha um NSArray de objetos UIColor como uma variável de instância da sua classe (o controlador de exibição que atua como delegado/fonte de dados), digamos que você o chame sectionColors . Você pode inicializar as cores nesta matriz a partir de valores em sua lista ou codificar as cores.

Então, use este código:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *tempHeaderView=[[UIView alloc]initWithFrame:CGRectMake(0,0,320,44)];


   //This changed:
    tempHeaderView.backgroundColor = [sectionColors objectAtIndex:section];

    [tempHeaderView addSubView: tempHeaderLabel];

    return tempHeaderView;
   //Use 'return [tempHeaderView autorelease];' in a non-ARC environment
}

É assim que você poderia inicializar o array:

// Assuming your table has three sections (indices 0 through 2)

UIColor* colorForSection0 = [UIColor colorwithRed:redValue0 green:greenValue0 blue:blueValue0 alpha:1.0];
// redValue0, etc. are floats between 0.0 and 1.0 that you can read from a .plist
// Alternatively, store them as integers between 0 and 255, and divide them by 255.0 
// and store on CGFloat variables before creating color.

// ...Do the same for the other colors...

// Now that you have the colors, create array and store in ivar 'sectionColors'
sectionColors = [[NSArray alloc] initWithObjects: 
    ColorforSection0, ColorForSection1, colorForSection2, nil];

(o código acima deve ir dentro do inicializador da fonte de dados table view)

3
adicionado
Claro ... Mas você pode ler os valores R, G, B do plist e inicializar as cores de acordo. Mas a ideia é a mesma: ele precisa de uma matriz de UIColor e selecionar a cor no índice 'section'. Eu não entrei em detalhes de COMO ele deveria criar o array.
adicionado o autor Nicolas Miari, fonte
Acabei de editar a resposta para deixar claro que você não pode ler o UIColor diretamente de .plist.
adicionado o autor Nicolas Miari, fonte
Vou te dar um exemplo e você vai me dar um carrapato;)
adicionado o autor Nicolas Miari, fonte
Eu não sou um especialista em InterfaceBuilder, mas talvez haja uma maneira de armazenar uma matriz de cores em algum lugar no NIB relevante?
adicionado o autor Nicolas Miari, fonte
Eu acho que é isso que eu precisava. Obrigado!
adicionado o autor Pavel Kaljunen, fonte
O UIColor não pode ser armazenado diretamente em uma plist, mas esse conceito pode ser facilmente adaptado para usar strings no plist para representar qual cor usar.
adicionado o autor Chris Trahey, fonte
Nota sobre pureza MVC; Recomenda-se que qualquer coisa na plist seja apenas modelo (ou seja, um estado de seções 'habilitadas'), e não estilo (ou seja, que cor deve ser uma seção desativada). Portanto, uma solução como essa deve envolver a visão como responsável pela contração do array de UIColors. Pedante, talvez, mas nós temos esses padrões por uma razão, então vale a pena mencionar.
adicionado o autor Chris Trahey, fonte

Você precisará usar a seção passada e relacioná-la a uma das seções em seu arquivo plist. Você provavelmente carregará um dicionário da "seção" como existe no plist (provavelmente carregado com base em sua posição em um array sendo o mesmo que seção), e então usar valueForKey: @ "enabled" ou similar em um if() verifique e defina seu estado de acordo.

2
adicionado