SwiftUI - was geht (in Views)?

  • SwiftUI - was geht (in Views)?

    Moin!

    Ich mache gerade - notgedrungen für ein Widget - meine ersten Gehversuche in SwiftUI. Für viele von Euch eher lächerlich, aber ich habe ein ziemliches Verständnisproblem:

    Innerhalb der Views kann ich ja durchaus einen gewissen Teil an Programmlogik unterbringen, aber ich stolpere immer wieder über Fälle, in denen es nicht geht. Zum Beispiel wollte ich die Helligkeit einer UIColor manipulieren und als Color für Text verwenden:

    Quellcode

    1. var h, s, b, a: CGFloat
    2. (h, s, b, a) = (0, 0, 0, 0)
    3. UIColor(barColor).getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    4. b = max(min(b - 0.6, 1.0), 0.0)
    5. let textColor = Color(hue: h, saturation: s, brightness: b)
    Dieser Code wurde in den Zeilen 2-4 mit der Fehlermeldung 'buildExpression' is unavailable: this expression does not conform to 'View' quittiert, funktioniert aber ausgelagert in eine Extension von Text.

    Nach welcher Logik sind manche Operationen in einer SwiftUI-View möglich und andere nicht? Gibt es dazu eine Dokumentation / Erklärung, die mir beim Verständnis hilft?

    Grüße, Mattes ?(
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Views in SwiftUI sind keine Views im herkömmlichen Sinne wie UIViews oder NSViews. Ein SwiftUI-View beschreibt den Zustand, aus dem der UIView gebildet / aktualisiert wird. Damit SwiftUI Zustandsänderungen mitbekommt, müssen Zustandsfelder im View mit @State gekennzeichnet werden. Die Zustandsfelder dürfen aber nicht während des Zeichnens verändert werden.

    Color ist auch eine View-Klasse und der Aufbau der View-Hierarchie wird von SwiftUI gesteuert. Ich vermute, dass sich SwiftUI die Objekte „ansieht“, um die Zustandsvariablen rauszufischen, und deswegen mag es wahrscheinlich auch nicht, wenn du so einfach Views erzeugst.

    Du solltest stattdessen Color erst erstellen, wenn du sie verwendest. Möglich ist auch eine @ViewBuilder-Methode, die das Color-Objekt erzeugt.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Du solltest stattdessen Color erst erstellen, wenn du sie verwendest. Möglich ist auch eine @ViewBuilder-Methode, die das Color-Objekt erzeugt
    Danke :) Das muss ich noch einmal in Ruhe auf der Zunge zergehen lassen ... Im Moment mache ich genau das ("Erstellen wenn benötigt") über die Extension, aber ich glaube mir fehlen noch Grundlagen über die Mechaniken von SwiftUI.

    Ich bleibe dran - und bin über Hinweise auf gute (!) einführende Literatur dankbar.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.