IBOutlet mit Arrays

  • IBOutlet mit Arrays

    Nach einigem Suchen (weil ja in Swift irgendwie noch so manches im Fluss ist und immer wieder anders implementiert wird), habe ich herausgefunden, dass man Arrays als Outlet wie folgt definiert :


    Quellcode

    1. @IBOutlet var labels: Array<NSTextField>!
    Nur, wie mache ich hier weiter? Ich würde ja gerne dieses den 8 Lables in meiner Oberfläche "zuweisen".
    Allerdings bietet mir Xcode nur die Option Outlet oder Action.
    Übersehe ich hier was oder geht das gar nicht so?

    Hans
  • Hallo,

    ich finde, dass so etwas viel einfacher geht, sogar ohne Outlets.

    Gib jedem TextField eine einmalige ID, also Tag/Identifier.
    Dann fügst Du Deinem ViewController eine Hilfsmethode hinzu, wie z.B. -textFieldForTag:(NSInteger)tag
    Darin gehst Du mit einer Schleife über alle Subviews und prüfst auf die Kennung.

    Das sind wenige Zeilen Code…

    Viele Grüße
  • HansGerber schrieb:

    macmoonshine schrieb:

    Versuch es mal über eine Outletcollection.
    Unfortunately, IBOutletCollection is only supported on iOS. For OS X, you'll have to create a separate outlet for each object, or else come up with an alternate way to reference the text fields in your XIB.
    Geht wohl nicht... :(
    Alternativ kann man auch einen unsichtbaren Containerview verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    HansGerber schrieb:

    macmoonshine schrieb:

    Versuch es mal über eine Outletcollection.
    Unfortunately, IBOutletCollection is only supported on iOS. For OS X, you'll have to create a separate outlet for each object, or else come up with an alternate way to reference the text fields in your XIB.
    Geht wohl nicht... :(
    Alternativ kann man auch einen unsichtbaren Containerview verwenden.
    Das wird doch aber super kompliziert, wenn du den Interface Builder benutzt und die Controls sich über das ganze Window verteilen. Dann müssen sich Views doch überlagern? Dann noch durchzusteigen und die richtigen zueinander Abstände einzuhalten halte ich für ziemliches Geprickelt oder sehe ich das falsch?

    Edit: Ich sehe gerade, dass ein Containerview ein Pattern für iOS ist. Insofern ist Frage vllt. auch falsch gestellt ;)
  • jopjip schrieb:

    macmoonshine schrieb:

    HansGerber schrieb:

    macmoonshine schrieb:

    Versuch es mal über eine Outletcollection.
    Unfortunately, IBOutletCollection is only supported on iOS. For OS X, you'll have to create a separate outlet for each object, or else come up with an alternate way to reference the text fields in your XIB.
    Geht wohl nicht... :(
    Alternativ kann man auch einen unsichtbaren Containerview verwenden.
    Das wird doch aber super kompliziert, wenn du den Interface Builder benutzt und die Controls sich über das ganze Window verteilen. Dann müssen sich Views doch überlagern? Dann noch durchzusteigen und die richtigen zueinander Abstände einzuhalten halte ich für ziemliches Geprickelt oder sehe ich das falsch?
    Edit: Ich sehe gerade, dass ein Containerview ein Pattern für iOS ist. Insofern ist Frage vllt. auch falsch gestellt ;)
    Die Textfelder musst du doch sowieso ausrichten. Ein Containerview macht das in der Regel nicht schwieriger. Ein Containerview ist unter OSX in der Regel einfach ein NSView. Ggf. kann man dafür auch einen Stackview verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • meinst du vielleicht das:

    //Labels definieren
    @IBOutlet var label1: UILabel!
    @IBOutlet var label2: UILabel!
    @IBOutlet var label3: UILabel!


    //Label in ein Array packen
    var labels: [UILabel!] { return [label1, label2,label3 ]}


    // Um alle Label einen zeichnen
    for item in (self.labels) {
    item.layer.borderWidth = 1
    item.layer.borderColor = UIColor.blackColor().CGColor
    }