2010-12-05 8 views
29

Ich möchte ein Array mit einer Reihe von UIImageViews, die ich in Interface Builder habe. Statt 20 oder 30 mitWie mache ich IBOutlets aus einem Array von Objekten?

IBOutlet UIImageView *img1; 

und verbindet sie alle auf diese Weise, und sie dann in ein Array setzen, ist es eine Möglichkeit, eine Reihe von IBOutlet UIImageViews zu erklären?

Nur so habe ich nicht so viele Deklarationen in meiner Header-Datei.

Antwort

40

Es ist möglich, es Ausgang Sammlung genannt wird. Dies ist die Art und Weise eine Steckdose Sammlung zu definieren:

@property(retain) IBOutletCollection(UIImageView) NSArray *images; 

Jetzt können Sie mehr als ein Objekt in die Steckdose in der Interface Builder-Stick, wird das Array für Sie erstellt werden, wenn die Schnittstelle geladen wird.

+7

Es hat ziemlich lange gedauert, bis ich herausgefunden habe, wie man in xcode 4 mehr als ein Objekt an die Steckdose klebt. Nachdem ich die IBOutletCollection im Code erstellt hatte, konnte ich CTRL-Drag aus der UIImageView herausziehen. Dies funktioniert aus irgendeinem Grund nicht. Wählen Sie dazu den Besitzer der Datei aus, öffnen Sie den Inspektor "Verbindungen" und ziehen Sie dann nacheinander aus dem Bereich "Outlet-Sammlungen" in jede UIImageView. –

+0

Ich konnte nicht herausfinden, wie man das umsetzt - danke @BenClayton! – guptron

+0

In der Entwicklervorschau von xcode 5 scheint das Problem, dass @BenClayton erwähnt wurde, gelöst zu werden - STRG-Ziehen funktioniert jetzt, um an das Array zu binden. Schöne Antwort hier! –

-4

Es ist leider nicht, aber Sie können alle die Erklärungen in einer einzigen Zeile halten:

IBOutlet UIImageView *img1, *img2, *img3, *img4; 

Die andere Option (wahrscheinlich am besten, da man so viele von ihnen haben) wäre sie programmatisch erstellen und speichern sie in einem Array, dann sie von Ihrer view-Controller-Klasse zu der Ansicht hinzufügen, indem für jeden,

[self.view addSubview:img]; 

auch bedenken, dass, wenn die Elemente sind statisch (wie Hintergrund-Elemente), und Sie muss nicht wirklich auf sie zugreifen, Sie müssen nicht deklarieren Steckdosen für jedes; Sie können sie einfach zur nib-Datei hinzufügen und sie vergessen.

Gleiches gilt für UIButton Instanzen. Wenn Sie nicht brauchen, um etwas über die Schaltfläche zu ändern, können Sie es von der Methode zugreifen, die es nennt, etwa so:

-(IBAction) buttonPressed:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    // method guts 
    // stuff with button -- access tag, disable, etc 
} 
+0

Ich würde sie programmatisch erstellen, aber sie alle müssen an bestimmten Orten gehen, und ich will nicht zu haben, zu setzen wo man jeden steckt. Und ich muss sie zu bestimmten Zeiten von versteckt zu nicht versteckt ändern, also muss ich auf sie zugreifen können. Die Single-Line-Deklaration wird es mindestens sehen lassen. – Marty

+0

Ja, wir bekommen keine Kakaobindungen auf dem iPhone, das ist wirklich das Beste, was wir tun können. Hat das die Frage beantwortet? –

4

Ich bin ein wenig spät hier, aber es kann einfacher sein, die Tag-Eigenschaft jedes ImageView in IB zu setzen, dann auf sie wie [some_superview viewWithTag:tag] zugreifen, anstatt ein separates Handle zu jedem zu halten.

2

Swift 3 und höher:

@IBOutlet var stuckLabels: [UIImageView] 
0

Hier ist einfacher Weg, es zu tun.

diese Schritte aus, eine Reihe von Filialen erstellen ein mit IB-Elemente verbinden:

  • Erstellen Sie ein Array von IBOutlets
  • mehrere UIElements (Views) in der Storyboard-Viewcontroller-Schnittstelle
  • Select Viewcontroller hinzufügen (In Storyboard) und öffnen Sie die Verbindung Inspektor
  • Es gibt Option 'Outlet-Sammlungen' in Connection Inspector (Sie werden eine Reihe von Steckdosen dort sehen)
  • Eine Verbindung, wenn mit Ihren Interface-Elementen

-

class ViewController2: UIViewController { 


    @IBOutlet var collection:[UIView]! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

enter image description here

Verwandte Themen