2009-06-23 6 views

Antwort

1

Warum setzen Sie die Ansichten nicht in ein Array und erhalten Referenzen mit dem Array-Index?

- (void)modifyViewNumber:(int)number 
{ 
    UIView* view = [views objectAtIndex:number]; 
    [view dosomething]; 
} 
7

Versetzen Sie die Ansichten beim Start in ein Array.

0

Erstellen Sie ein Array von Ansichten. Fügen Sie jede in der angegebenen Reihenfolge hinzu und referenzieren Sie sie anschließend mit dem Array-Index.

Wenn die Nummern nicht sequenziell sind, verwenden Sie eine Hashtabelle.

Reflexion könnte eine Option sein, könnte aber langsamer sein (ich bin kein Objective C Guru, weiß nicht, ob das praktisch ist).

0

Ich nehme an, dass Sie mit Interface Builder diese Ansichten einrichten?

Möglicherweise muss mich jemand dazu korrigieren, aber ich glaube, dass Sie in Ihrer Klasse einen NSArray Interface Builder erstellen und ihm dann alle Ihre Ansichten zuweisen können. Beispielsweise könnten Sie "IBOutlet NSArray * views" deklarieren; in Ihrer Header-Datei, und verwenden Sie dann Schnittstellen-Builder-Bindungen, um alle 25 Ansichten an diese Eigenschaft zu binden. Sie werden automatisch zum Array hinzugefügt, und Sie können dann sauber in Ihrem Code darüber iterieren.

+0

Wenn Sie richtig sind, verdienen Sie sicherlich einen +1 dafür! – teabot

+2

Sorry - sieht so aus, als hätte ich mich geirrt. Die Dokumentation des Interface Builders sagt: "Es kann immer nur ein Objekt mit einem bestimmten Ausgang verbunden sein." Ich schwöre, ich habe das irgendwie gemacht - also werde ich weiter suchen. Sorry für die falsche Antwort. –

+0

Ben, es ist wahrscheinlich besser, wenn Sie Ihren Kommentar als Bearbeitung zu Ihrer Antwort hinzufügen. – Abizern

3

Sie einen Tag auf jede Ansicht setzen könnte und eine for-Schleife mit dem folgenden Verfahren verwenden:

- (id)viewWithTag:(NSInteger)aTag 
1

Viele Leute haben gesagt, ein Array verwenden - ich tue dies die ganze Zeit, es ist wirklich der einzige Weg, zu gehen, wenn Sie einen Interface Builder verwenden, aber ich wollte ein wenig hinzufügen.

Manchmal kann es schwierig sein, die Werte in das Array zu bekommen. Es gibt normalerweise eine Möglichkeit, ein Array aller Steuerelemente auf dem Bildschirm zu erhalten. Normalerweise nehme ich das und iteriere darüber, suche nach einer Art von Steuerelement mit einem bestimmten Benennungsmuster und sammle diese in meinem eigenen Array.

Auf diese Weise können Sie oft ein neues Steuerelement ohne Codeänderung hinzufügen (immer eines meiner Lieblingsziele).

+0

Das ist nicht ganz das, was ich hier will - ich wollte nur bestimmte Ansichten. Aber das ist eine interessante Idee. Wie haben Sie eine Reihe von Steuerelementen erhalten? – Walker

+0

Ich bin nicht sicher in Objective-C ... Java jedes Panel hat eine getControls() -Methode. –

3

Niemand hat vorgeschlagen? Das klingt nach dem, wofür es gemacht ist.

Der Nachteil ist, dass die Ansichten alle Steuerelemente wie Textfelder oder Schaltflächen sein müssen. Betrachten Sie im Grunde seine Klassenreferenz und sehen Sie, ob sie irgendwann von NSControl erbt. Wenn es diesen Test besteht, ist NSMatrix eine Option. (Hier ist the list of all AppKit classes, um dies einfach zu machen.)

Um eine Kontrolle in eine Matrix in IB zu machen, erstellen Sie eine der Kontrolle auf die übliche Weise, dann ziehen Sie die Option Größe ändern. Es scheint zunächst nichts zu tun, aber ziehen Sie weiter. Anstatt die Größe zu verändern, wird deine Kontrolle zunehmen; Es ist jetzt eine Matrix von Zellen statt einer einzigen Kontrolle.

0

Angenommen, Interface Builder (ansonsten einfach wie zuvor beantwortet). Dies ist das Beste, was ich schaffen könnte:

In.h:

{ 
    UILabel   *banner[NUM_BANNERS]; 
} 
@property (nonatomic, retain) IBOutlet UILabel *banner0; 
@property (nonatomic, retain) IBOutlet UILabel *banner1; 
@property (nonatomic, retain) IBOutlet UILabel *banner2; 
etc. 

In .m:

- (void)viewDidLoad 
{ 
    banner[0] = banner0; 
    banner[1] = banner1; 
    banner[2] = banner2; 
    etc. 

dann von Arrayindex zugreifen kann. Denken Sie daran, zu veröffentlichen.