Wie setze ich Hintergrundfarbe für bestimmte Abschnittsüberschriften?

Ich habe eine TableView mit 10 Abschnitten, die aus einer Plist-Datei geladen werden und ich habe Schalter, mit denen einige der Abschnitte ausgeschaltet werden können. Ich muss eine bestimmte Hintergrundfarbe für jeden Abschnitt mit der Tatsache festlegen, dass der Abschnitt deaktiviert werden kann.

Beispiel:

for section Black I need to set black background

for section Red I need to set red background

und so weiter...

-(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
hinzugefügt bearbeitet
Ansichten: 1
Wenn Sie ARC (Automatische Referenzzählung) nicht verwenden, verliert Ihr Code die Temp-Überschrift. Überprüfen Sie meine Antwort für eine Lösung in diesem Fall.
hinzugefügt der Autor Nicolas Miari, Quelle
+1 für die Verwendung von ARC :)
hinzugefügt der Autor Nicolas Miari, Quelle
Ich benutze ARC ... Danke!
hinzugefügt der Autor Pavel Kaljunen, Quelle

2 Antworten

Behalten Sie ein NSArray von UIColor -Objekten als Instanzvariable Ihrer Klasse bei (der View-Controller, der als Delegate/Datenquelle fungiert), sagen Sie: sectionColors . Sie können die Farben in diesem Array anhand der Werte in Ihrem Plist initialisieren oder die Farben fest codieren.

Dann benutze diesen Code:

-(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
}

So können Sie das Array initialisieren:

// 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];

(Der obige Code sollte in den Initialisierer der Datenquelle der Tabellenansicht gehen)

3
hinzugefügt
Natürlich ... Aber Sie können die R, G, B Werte aus dem Plist lesen und die Farben entsprechend initialisieren. Aber die Idee ist die gleiche: Er benötigt eine Reihe von UIColor und die Farbe im Index "Abschnitt" auswählen. Ich ging nicht ins Detail, WIE er das Array erstellen soll.
hinzugefügt der Autor Nicolas Miari, Quelle
Ich habe gerade die Antwort bearbeitet, um klarzustellen, dass Sie UIColor nicht direkt aus .plist lesen können.
hinzugefügt der Autor Nicolas Miari, Quelle
Ich gebe dir ein Beispiel und du gibst mir ein Häkchen;)
hinzugefügt der Autor Nicolas Miari, Quelle
Ich bin kein InterfaceBuilder-Experte, aber vielleicht gibt es eine Möglichkeit, ein Array von Farben irgendwo in der relevanten NIB zu speichern?
hinzugefügt der Autor Nicolas Miari, Quelle
Ich denke, das ist es, was ich brauchte. Vielen Dank!
hinzugefügt der Autor Pavel Kaljunen, Quelle
UIColor ist nicht direkt in einem Plist speicherbar, aber dieses Konzept könnte leicht angepasst werden, um Strings im Plist zu verwenden, um darzustellen, welche Farbe verwendet werden soll.
hinzugefügt der Autor Chris Trahey, Quelle
Hinweis zur MVC-Reinheit; Es wird empfohlen, dass alles in der PLIST nur Modell ist (d. h. der Zustand eines Abschnitts "aktiviert") und nicht Stil (d. h. welche Farbe ein deaktivierter Abschnitt sein sollte). Eine solche Lösung sollte die Ansicht umfassen, die für die Kontraktion der UIColors verantwortlich ist. Pedantisch vielleicht, aber wir haben diese Muster aus einem bestimmten Grund, deshalb ist es erwähnenswert.
hinzugefügt der Autor Chris Trahey, Quelle

Sie müssen den übergebenen Abschnitt verwenden und ihn mit einem der Abschnitte in Ihrer PLIST-Datei verknüpfen. Sie werden wahrscheinlich ein Wörterbuch des "Abschnitts" laden, so wie es in der PLIST vorhanden ist (wahrscheinlich geladen basierend auf seiner Position in einem Array, das dem Abschnitt entspricht), und dann valueForKey verwenden: @ "enabled" oder ähnlich in einem if() überprüfen Sie und stellen Sie Ihren Status entsprechend ein.

2
hinzugefügt