IBOutletCollection set bestellen im Interface Builder
Ich bin mit IBOutletCollections Gruppe mehrere Instanzen von ähnlichen UI-Elemente. Insbesondere der I-Gruppe eine Reihe von UIButtons (die sind ähnlich wie Summer in einem quiz) und einer Gruppe von UILabels (die Anzeige der Partitur). Ich möchte sicherstellen, dass das Etikett direkt über die-Taste der Punktestand aktualisiert. Ich dachte mir, dass es am einfachsten ist, auf Sie zuzugreifen, die durch den index. Leider, auch wenn ich Sie in der gleichen Reihenfolge, Sie haben nicht immer die gleichen Indizes. Gibt es eine Möglichkeit, die im Interface Builder, um die richtige Bestellung.
InformationsquelleAutor gebirgsbärbel | 2011-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Mehrere Kommentatoren haben behauptet, dass neuere Versionen von Xcode zurück
IBOutletCollections
in der Reihenfolge in der die verbindungen hergestellt sind. Andere haben behauptet, dass dieser Ansatz nicht für Sie arbeiten auf storyboards. Ich habe noch nicht getestet, mich aber, wenn Sie bereit sind, verlassen Sie sich auf undokumentierte Verhalten, dann können Sie feststellen, dass die explizite Sortierung habe ich vorgeschlagen, unten ist nicht mehr notwendig.Leider, es scheint nicht zu irgendeiner Weise zu Steuern, die Reihenfolge der
IBOutletCollection
im IB, also müssen Sie Sie Sortieren das array, nachdem es geladen wurde, basiert auf einer Eigenschaft des views. So Sortieren Sie die Ansichten, die basierend auf Ihrentag
Eigentum, aber die manuelle Einstellung von tags in IB, kann ziemlich mühsam.Glücklicherweise neigen wir dazu zu legen, unsere Ansichten in der Reihenfolge wollen wir Ihnen den Zugang, so ist es oft ausreichend, Sortieren das array basierend auf der x-oder y-position wie dieser:
Gut, dieses Beispiel nur zeigt, wie Sortieren nach y-position. Du hast Recht, dass Sie brauchen, zu zwicken die Komparator-wenn Sie möchten, Sortieren Sie nach x auf.
return [[NSNumber numberWithFloat:[obj1 frame].Herkunft.x] vergleichen Sie mit:[NSNumber numberWithFloat:[obj2 frame].Herkunft.x]]; - das Sortieren von x
Für den nutzen von neuen Besuchern auf diese Frage, Xcode jetzt scheint zuverlässig beibehalten der Reihenfolge der IBOutletCollection Ansichten.
Ich glaube nicht, dass dies der Fall ist bei der Verwendung von storyboards.
InformationsquelleAutor cduhn
Lief ich mit cduhn Antwort und machte diese NSArray Kategorie.
Wenn nun xcode wirklich bewahrt die design-Zeit, um diesen code nicht wirklich nötig, aber wenn Sie finden, sich selbst zu erstellen/neu erstellen großen Sammlungen in IB und wollen nicht sorgen zu machen, vermasselt das könnte helfen (während der Laufzeit). Auch ein Hinweis: wahrscheinlich die Reihenfolge, in der die Objekte wurden der Sammlung Hinzugefügt hatte etwas zu tun mit dem "Objekt-ID" finden Sie im Identity Inspector die Registerkarte, die sporadisch beim Bearbeiten der Oberfläche und der Einführung von neuen Objekten zu der Auflistung zu einem späteren Zeitpunkt.
.h
.m
Dann schließen Sie die Headerdatei, als Sie beschlossen, nennen Sie es, und Sie können den code:
Schön, hätte ich nicht gedacht. Vorteil ist Sie müssen nicht schaffen einen zusätzlichen array, müssen nur sicherstellen, dass alle Elemente richtig benannt sind. Einzige, was zu prüfen ist, wie Häufig diese Elemente zugegriffen werden. Performance mit [NSString stringWithFormat:] langsamer ist, als sich die Dinge in einem vordefinierten array.
Ich bin zweifelhaft, dass der Zugriff auf UI-Elemente je einem performance-Engpass in einer realen Anwendung, aber wenn wir annehmen, daß es war, konnte man immer in einer Schleife durch, Sie einmal in der viewDidLoad-und dump die Referenzen in einen array für einen späteren Zugriff.
Dieser code scheint zu funktionieren. Jedoch, Xcode 4.3.2 erscheint, um die Steckdosen, wie Sie aufgelistet sind, von oben nach unten in der Ansicht und so nach einigen tests werde ich nicht benötigen, es zu benutzen, aber es ist gut, code und Wert +1.
InformationsquelleAutor Ivan Dossev
Nicht sicher, wenn dies änderte sich exakt, aber als Xcode 4.2 zumindest, dies nicht mehr scheint ein problem zu sein. IBOutletCollections nun die Erhaltung der Reihenfolge, in der die Ansichten wurden Hinzugefügt, die im Interface Builder.
UPDATE:
Machte ich ein test-Projekt, um zu überprüfen, dass dies der Fall ist: IBOutletCollectionTest
Dies scheint nicht der Fall zu sein. Ich bin immer eine konsistente Reihenfolge nur ändern, wenn ich Entfernen oder hinzufügen von Elementen zu den outlet Sammlung, aber es ist NICHT der gleichen Reihenfolge, dass ich Sie Hinzugefügt
Ich habe versucht eine simple 3x3 button-raster für die Zwecke der Herstellung einer iPad-Typ Code-Sperre für die app, sondern die um Sie sind, die in scheinbar völlig zufällig. Offensichtlich habe ich Hinzugefügt, Sie in der Reihenfolge (1-9,0), aber die Reihenfolge im array zur Laufzeit ist 2,7,5,9,8,4,6,1,3,0. Ordnung scheint, haben absolut keine Korrelation zwischen der Reihenfolge, wie Sie Hinzugefügt wurden, die Ansicht, in der Reihenfolge, wie Sie Hinzugefügt wurden, um die outlet-collection, oder sogar jede Art von räumlichen Sortierung
Ich baute ein test-Projekt, um zu überprüfen, dass ich bin nicht verrückt: charcoaldesign.com/resources/IBOutletCollectionTest.zip - Schaltfläche, um in die outlet-Kollektion, folgt der Reihenfolge, in der Sie gebunden waren. Ändern Sie die Reihenfolge der Ansichten, macht keinen Unterschied. Wenn ich die Bindung und binden eine individuelle Ansicht dann ändert sich die Reihenfolge in einer vorhersagbaren Weise. Können Sie bieten einen Gegenentwurf zu widerlegen?
Haben Sie auch versucht, sich in der Storyboard-editor? Zumindest die, die ich nicht bekommen kann es arbeiten im Storyboard-editor von Xcode 4.3.3. Die Ordnung Durcheinander, wenn etwas in der Storyboard-Datei verändert wird.
InformationsquelleAutor Nick Lockwood
Nicht so weit wie ich informiert bin.
Als workaround, konnte Sie weisen Sie jeder von Ihnen einen tag, der Reihe nach. Die Tasten Reichweite 100, 101, 102, etc. und die Etiketten, 200, 201, 202, usw. Dann fügen Sie 100 bis der Schaltfläche Tags, um seine entsprechenden label-tag. Sie können dann die Beschriftung mithilfe
viewForTag:
.Alternativ könnten Sie die entsprechenden Objekte in Ihrer eigenen
UIView
, so dass Sie nur noch einen Knopf und ein label-per-view.InformationsquelleAutor Jim
Fand ich, dass Xcode sortiert die Auflistung alphabetisch mit der ID der Verbindung.
Wenn Sie öffnen Sie die editor version auf Ihre nib-Datei können Sie ganz einfach Bearbeiten Sie die id ' s (machen Sie sicher, dass Sie eindeutig sind, ansonsten Xcode stürzt ab).
Hilft es, wenn Sie zuerst um Ihr Objekt manuell in das Dokument Umriss des IB, so dass Sie zeigen, bis in der Folge, in der der xml-code.
Hmm. Ist das ein zuverlässiges Verhalten der Laufzeit? Wenn es nicht dokumentiert ist, dann ist es nicht Teil des frameworks " - Vertrag, und könnte sich in Zukunft ändern. Ich würde nicht schreiben eine app, die je auf dieses Verhalten.
Bitte dies NIE tun. Ob es funktioniert oder nicht ist irrelevant, das ist Verschleierung, sieht aus wie schwarze Magie, um andere Entwickler und gebrochen werden kann, zu jeder Zeit !
wow!!! dies ist eine schreckliche Idee! die brechen alle Zeit
InformationsquelleAutor massimobio
Es scheint sehr zufällig, wie IBOutletCollection bestellt ist. Vielleicht bin ich nicht zu verstehen, Nick Lockwood die Methodik korrekt - aber ich machte auch ein neues Projekt, eine Reihe von UILabels, und Verband Sie zu einer Auflistung in der Reihenfolge, wie Sie Hinzugefügt wurden, um die Ansicht.
Nach der Anmeldung bekam ich eine zufällige Reihenfolge. Es war sehr frustrierend.
Mein workaround war die Einstellung tags in IB und Sortieren dann die Sammlungen etwa so:
Hier, resultRow1 ist ein IBOutletCollection von etwa 7-Etiketten, - tags gesetzt, IB. Hier ist die Methode "sort":
Dabei, ich kann jetzt den Zugriff auf Objekte durch die Verwendung
[resultRow1 objectAtIndex: i]
oder so. Das spart Aufwand für die Iteration durch und Vergleiche tags jedes mal, wenn ich brauche, um den Zugriff auf ein element.InformationsquelleAutor bgoers
Brauchte ich diese Bestellung für eine Sammlung von UITextField-Objekte für das setting, in dem die "Next" - Taste auf der Tastatur führen würde (Tab-Feld). Dies ist eine internationale app, so wollte ich die Sprache, die Richtung zu mehrdeutig sein.
.h
.m
Nutzung (nach dem layout)
InformationsquelleAutor David Robles
Hier ist eine Erweiterung, die ich erstellt
Array<UIView>
zu Sortierentag
, z.B. nützlich bei der Arbeit w/IBOutletCollection
s.InformationsquelleAutor Scott Gardner