Hintergrundfarbe einer TableCell abfragen

  • Hintergrundfarbe einer TableCell abfragen

    Hallo zusammen,

    wie kann ich mit einer If-Abfrage die Hintergrundfarbe einer Zelle abfragen?

    Die Befehlskette

    Quellcode

    1. UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
    2. NSLog(@"selectedCell: %@", selectedCell.backgroundColor);



    in meiner "didSelectRowAtIndexPath"-Methode gibt mir die Ausgabe

    "selectedCell: UIDeviceRGBColorSpace 1 1 1 1"

    Wenn ich aber schreibe

    Quellcode

    1. if ([selectedCell.backgroundColor Value] == "UIDeviceRGBColorSpace 1 1 1 1") {
    2. NSLog(@"Farbe ist weiss");
    3. }



    würde ich eine UIColor mit einem String vergleichen, was natürlich eine Fehlermeldung produzieren würde.

    Wie müsste meine Abfrage richtig lauten? Danke für eure Hilfe!

    Viele Grüße
    Lars
  • HerrLehmann schrieb:

    würde ich eine UIColor mit einem String vergleichen, was natürlich eine Fehlermeldung produzieren würde.

    Das was NSLog an der Stelle ausgiebt ist nur eine Darstellung eines Objektes. Das kann irgendwie formatiert sein. Auf KEINEN Fall ist es aber ein NSString, den Du als Vergleichswert nehmen kannst.

    Versuche es mal, indem Du ein UIColor-Objekt als Referenz erzeugst und dieses mittels isEqual: mit der Hintergrundfabre vergleichst.
  • HerrLehmann schrieb:

    würde ich eine UIColor mit einem String vergleichen, was natürlich eine Fehlermeldung produzieren würde.

    Nein, Du vergleichst zwei Pointer miteinander. Diese Bedingung ist niemals wahr. Wahrscheinlich noch nicht einmal in einem Paralleluniversum.

    Du musst Dir die CGColor-Werte holen, und die miteinander vergleichen:

    Quellcode

    1. CGColorEqualToColor(electedCell.backgroundColor.CGColor, [UIColor whiteColor].CGColor)


    Das funktioniert aber nur, wenn das beides mal das gleiche Weiß aus dem gleichen Farbraum ist. Wenn es Dir darum geht, den Zustand einer Zelle zu ermitteln (z. B. Weiß = deselektiert), dann solltest Du das über eine entsprechende Property oder Setter / Getter machen. Insbesondere solltest Du den Zustand in einem geeigneten Attribut (z. B. BOOL, enum) abspeichern.
    „Meine Komplikation hatte eine Komplikation.“
  • Vielen Dank schon einmal für eure Beiträge.

    Hintergrund meiner Anfrage ist folgender: Meine Tabelle soll die Funktion haben, dass man sieben Personen auswählen soll. Man kann also in der Tabelle eine Zelle durch auswählen aktivieren und wenn man sie wieder auswählt deaktivieren. Sobald sieben Zellen aktiviert sind, wird die TableView verlassen und die sieben ausgewählten Zellen / Personen in das Datenmodell übertragen.

    Man kann das einfach über UITableViewCellAccessoryCheckmark erreichen. Ich denke aber, dies geht nicht bei selbst gestalteten Zellen (custom table cell).

    Daher habe ich folgendes vor: In meiner CellForRowAtIndexPath-Methode gebe ich allen Zellen z.B. eine weiße Hintergrundfarbe. Wenn eine Zelle ausgewählt wird und die Zelle ist weiß, gebe ich ihr eine rote Hintergrundfarbe. Wird sie nochmals ausgewählt gebe ich ihr wieder eine weiße Hintergrundfarbe.


    Ich glaube Deinen Tipp - macmoonshine - werde ich einmal weiter verfolgen. Sicher würde z.B. auch

    Quellcode

    1. if (selectedCell.backgroundColor.CGColor isEqualToColor [UIColor colorWithRed:0.0/256.0 green:0.0/256.0 blue:0.0/256.0 alpha:1.0].CGColor)


    auch gehen?
  • Warum verwendest Du nicht einfach eine eigene Klasse für Tabellenzellen, der Du eine Property checked gibst? Den Setter musst Du selbst implementieren:

    Quellcode

    1. - (void)setChecked:(BOOL)inChecked {
    2. checked = inChecked;
    3. self.backgroundColor = inChecked ? [UIColor redColor] : [UIColor whiteColor];
    4. }

    Dann brauchst Du keine Farbvergleiche.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Warum verwendest Du nicht einfach eine eigene Klasse für Tabellenzellen, der Du eine Property checked gibst? Den Setter musst Du selbst implementieren:

    Quellcode

    1. - (void)setChecked:(BOOL)inChecked {
    2. checked = inChecked;
    3. self.backgroundColor = inChecked ? [UIColor redColor] : [UIColor whiteColor];
    4. }

    Dann brauchst Du keine Farbvergleiche.



    Ganz ehrlich: weil ich es nicht verstehe ;)

    Wie müsste ich dies dann in meiner "didSelectRowAtIndexPath"-Methode implementieren, also wie frage ich ab, ob eine Zelle"Checked" oder nicht "Checked" ist und wie ändere ich dann die Farbe der Zelle. Ich weiß ehrlich gesagt nicht, wie ich den Setter dann implementieren muss. Da bräuchte ich wohl einen Code.
  • Mit dem Schnipsel kannst Du die Hintergrundfarbe bei jedem mal tappen umdrehen:

    Quellcode

    1. - (void)tableView:(UITableView *)inTableView didSelectRowAtIndexPath:(NSIndexPath *)inPath {
    2. MyCell *theCell = (MyCell *)[tableView cellForRowAtIndexPath:inPath];
    3. theCell.checked = !theCell.checked;
    4. }

    Wenn Du irgendwo wissen willst, ob die Zelle markiert ist:

    Quellcode

    1. if(theCell.checked) {
    2. ...
    3. }
    „Meine Komplikation hatte eine Komplikation.“
  • HerrLehmann schrieb:

    Vielen Dank schon einmal für eure Beiträge.


    Ich glaube Deinen Tipp - macmoonshine - werde ich einmal weiter verfolgen. Sicher würde z.B. auch

    Quellcode

    1. if (selectedCell.backgroundColor.CGColor isEqualToColor [UIColor colorWithRed:0.0/256.0 green:0.0/256.0 blue:0.0/256.0 alpha:1.0].CGColor)


    auch gehen?


    Nein, bitte:
    a) CGColor ist vom Typ CGColorRef, das ist nicht mal eine Klasse. Ohne ein paar zus. Tanzschritte geht das gar nicht.

    b) Wenn die Instanzen von UIColor schon nicht vergleichbar sind, warum sollten es dann die in ihr gespeichereten Werte sein?

    c) Farben an sich sind als Informationsträger keine gute Idee.
    Farbräume, insb. Anzahl der Parameter sind immer ein Thema. Und bist Du sicher, dass das kein Gradient ist, oder gar ein Bild?
    I would be embarrassed if they did not spy on me.
  • HerrLehmann schrieb:

    Ich glaube Deinen Tipp - macmoonshine - werde ich einmal weiter verfolgen. Sicher würde z.B. auch

    Quellcode

    1. if (selectedCell.backgroundColor.CGColor isEqualToColor [UIColor colorWithRed:0.0/256.0 green:0.0/256.0 blue:0.0/256.0 alpha:1.0].CGColor)


    auch gehen?

    Ist mir erst durch den Beitrag von longw aufgefallen. Du solltest meinen Beitrag so versetehen: Farbvergleiche sind zwar prinzipiell möglich, können aber ganz viele eklige und unschöne Seiteneffekte haben. Du solltest keine Farben vergleichen. Das ist schlecht. Mach das auf keinen Fall, Niemals! (Ich hoffe das meine Intentition so einigermaßen rübergekommen ist.) ;)

    Deswegen schrieb ich auch:

    macmoonshine schrieb:

    Wenn es Dir darum geht, den Zustand einer Zelle zu ermitteln (z. B. Weiß = deselektiert), dann solltest Du das über eine entsprechende Property oder Setter / Getter machen. Insbesondere solltest Du den Zustand in einem geeigneten Attribut (z. B. BOOL, enum) abspeichern.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich schließ emich mal an. Farben sind in der Regel kein Bestandteil des Models. Verglichen werden aber ebenso in der Regel Modelentitäten. Übrigens stellt sich bei Farben analog zu Floats, die Frage, was Gleichheit bedeutet. Wenn die Farben für das menschliche Auge nicht mehr unterscheidbar sind? Wenn sie technisch nicht mehr differenziert werden können? Wenn sie exakt gleich sind? (Was mehr oder minder einem Zufall entspringt.)

    Übrigens vergleicht man regelmäßig nicht mit -isEqualTo:, weil das eine Methode des Scriptings ist. Entweder -isEqualTo…:, wenn es das gibt oder – mit Bauchschmerzen – -isEqual:. Dann sollte man aber nachdenken, ob man das -isEuqalTo…: nicht selbst nachholt. Aber das hast du ja auch richtig gemacht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Wenn die Farben für das menschliche Auge nicht mehr unterscheidbar sind?


    Nur noch so als Randbemerkung: Den Fall haben wir genau hier, denn seine Farbe:

    Quellcode

    1. [UIColor colorWithRed:0.0/256.0 green:0.0/256.0 blue:0.0/256.0 alpha:1.0]

    sieht genauso aus wie:

    Quellcode

    1. [UIColor blackColor];


    Sie haben aber unterschiedliche Farbräume und eben auch eine unterschiedliche Anzahl von Komponenten, nämlich 4 im ersten und 2 im zweiten Fall.
    I would be embarrassed if they did not spy on me.
  • Ich glaube ja, dass das Schwarz überall ganz anders aussieht und nicht dieselbe Farbe darstellt. ;) Diese "Farbe" gibt es außerhalb von schwarzen Löchern eher wenig. Von daher wird diese Farbe von dem menschlichen Auge nie angetroffen.

    Sei noch am Rande angemerkt, dass die Farbraumumwandlung mit Verlusten behaftet sein kann und sich daher ein Vergleich von vorne herein verbietet. Dies gilt ja umso mehr, als das RGBA und CMYKA ohnehin nur auf einer optischen Täuschung beruhen, die das Auge so halbwegs zufrieden stellt. Dass da mal zufällig Treffer bei sind, ist in etwa so wie der Vergleich zwischen Äpfeln und Birnen, weil ja 0 Äpfel in der Tat dasselbe sind wie 0 Birnen. Deshalb würde ich aber trotzdem nicht die beiden miteinander vergleichen wollen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Ich glaube ja, dass das Schwarz überall ganz anders aussieht und nicht dieselbe Farbe darstellt. ;) Diese "Farbe" gibt es außerhalb von schwarzen Löchern eher wenig. Von daher wird diese Farbe von dem menschlichen Auge nie angetroffen.

    Diese "schwarzen Farben" sind sogar die einzigen, die man auf der Purpurgeraden erkennen könnte, wenn man es schafft, sie mit einem Wurmloch zu treffen.

    Amin Negm-Awad schrieb:

    Sei noch am Rande angemerkt, dass die Farbraumumwandlung mit Verlusten behaftet sein kann und sich daher ein Vergleich von vorne herein verbietet. Dies gilt ja umso mehr, als das RGBA und CMYKA ohnehin nur auf einer optischen Täuschung beruhen, die das Auge so halbwegs zufrieden stellt. Dass da mal zufällig Treffer bei sind, ist in etwa so wie der Vergleich zwischen Äpfeln und Birnen, weil ja 0 Äpfel in der Tat dasselbe sind wie 0 Birnen. Deshalb würde ich aber trotzdem nicht die beiden miteinander vergleichen wollen.
    I would be embarrassed if they did not spy on me.