UIStackView via Code

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIStackView via Code

    Hallo,

    ich arbeite mich gerade durch "Programming iOS 11" von Matt Neuburg und wollte direkt das StackView austesten. In seinem Beispiel werden einfach UIViews erstellt und diese dann über das StackView angeordnet. Zur Übung wollte ich das mit Objekten aus der Object Library umsetzen und habe dafür 3 UILabel mit entsprechenden Outlets erstellt.

    Jetzt habe ich folgendes Problem:

    UIStackView(arrangedSubviews:) erwartet ein UIView-Array. Mein Label-Array wird deswegen nicht akzeptiert und wenn ich einen Downcast durchführe, geht mir die Eigenschaft des UILabels verloren.. Da es aber über das Storybord möglich ist, alle möglichen UIView-Unterklassen in einen StackView einzubetten, wollte ich fragen, wie dafür die Herangehensweise ist, wenn man es über Code lösen möchte.
    Mein Ansatz bisher:


    Quellcode

    1. @IBOutlet weak var label1: UILabel!
    2. @IBOutlet weak var label2: UILabel!
    3. @IBOutlet weak var label3: UILabel!
    4. override func viewDidLoad() {
    5. super.viewDidLoad()
    6. let labels = [label1, label2, label3]
    7. let views = labels as! [UIView]
    8. let sv = UIStackView(arrangedSubviews: views)
    9. }
    Alles anzeigen

    /Edit: wie peinlich.. es lag daran, dass ich die Optionals nicht richtig verwendet habe..


    Viele Grüße,
    Tazaki
  • Ich befürchte, dass ich gerade etwas auf dem Schlauch stehe.. :(

    Wenn ich es so mache:

    Quellcode

    1. let labels = [label1, label2, label3]
    2. let sv = UIStackView(arrangedSubviews: labels)

    Kommt folgende Fehlermeldung:

    Cannot convert value of type '[UILabel?]' to expected argument type '[UIView]'
    Insert ' as! [UIView]'
  • Dein Code hat funktioniert torquato, danke sehr! Und auch dir vielen Dank matz für den Hinweis! :)

    Ihr wisst ja, dass ich Neuling bin, deswegen hätte ich jetzt noch Verständnisfragen dazu..

    Also wenn es ein einheitliches Array ist, ist dein Ansatz sozusagen die "saubere Art" torquato?

    Und ist dieser Ansatz grundsätzlich falsch:

    Quellcode

    1. let views = [label1, label2, label3, button] as! [UIView]
    Es handelt sich bei allen Objekten um Outlets.

    Wie gehe ich vor, wenn wie in meinem Beispiel mehrere verschiedene Objekte erfasst werden sollen?
  • Tazaki schrieb:

    Ich befürchte, dass ich gerade etwas auf dem Schlauch stehe.. :(

    Wenn ich es so mache:

    Quellcode

    1. let labels = [label1, label2, label3]
    2. let sv = UIStackView(arrangedSubviews: labels)

    Kommt folgende Fehlermeldung:

    Cannot convert value of type '[UILabel?]' to expected argument type '[UIView]'
    Insert ' as! [UIView]'
    Dann ist eines der Label optional und man weiß nicht welchen Code du gerade verwendest.

    Du kannst dann auch mehrere verwenden


    C-Quellcode

    1. let label1 = anOptionalLabel
    2. let label2 = UILabel()
    3. let label3 = UILabel()
    4. let button = UIButton()
    5. let allViews = [
    6. label1,
    7. label2,
    8. label3,
    9. button
    10. ]
    11. let views = allViews.compactMap{ $0 }
    12. let stackView = UIStackView(arrangedSubviews: views)
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von matz ()

  • Tazaki schrieb:


    Und ist dieser Ansatz grundsätzlich falsch:

    Quellcode

    1. let views = [label1, label2, label3, button] as! [UIView]
    Es handelt sich bei allen Objekten um Outlets.

    Wie gehe ich vor, wenn wie in meinem Beispiel mehrere verschiedene Objekte erfasst werden sollen?
    Grundsätzlich falsch nicht, aber ein as! sollte man vermeiden.
    In diesem Fall ist die Type Inference von Swift eher kontraproduktiv. Ich würde diese Zeile einfach so schreiben:

    Quellcode

    1. let views: [UIView] = [label1, label2, label3, button]