Wie kann ich den programmgesteuerten Zugriff auf UI-Elemente in einer NIB-ohne "Verdrahtung" Sie?
Ich bin der Betrachtung schriftlich einige Hilfsfunktionen, um es einfacher zu machen einfache änderungen an der UI-Elemente in mein iPhone NIB. Vor allem - ich möchte den Zugriff auf ein UILabel, oder einem anderen element, über dessen Namen im Interface Builder. Ist das möglich? Ist es ein intelligenter Ansatz?
Beispiel
Sagen, ich will eine super-einfache iPhone-app, die zeigt 'Hello World'. Ich starte ein neues Projekt und öffnen Sie dann die Spitze ein und ziehen Sie ein UILabel in meiner Ansicht, und geben Sie ihm einen 'Namen' von 'LblMain'. Nun, angenommen, ich habe meine praktische Helfer-Funktion, ich möchte zu vergeben das label neuen text so etwas wie dieses:
[helper setText:@"Hello World" forLabel:@"LblMain"];
-oder-
UILabel *ObjTmp = [helper getUILabel:@"LblMain"];
ObjTemp.text = @"Hello World";
Nun - der trick ist, dass ich nicht hinzufügen:
IBoutlet UILabel *ObjLblMain;
überall in .h-Datei - ich bin nur der Zugriff auf das label dynamisch - wäre das nicht schön?!
Nun, für einfache apps, um ein paar mehr Beschriftungen oder Bilder, ich konnte ziehen Sie Sie in meine Feder, vergeben Sie die Namen in das element-Inspektor-Fenster, und dann sofort Zugriff auf diese innerhalb von code ohne Stottern & Streit der du Sie in die .h-Datei.
Motivation
- Im Grunde bin ich frustriert, dass ich auf Draht jedes element in meine Feder - es ist eine Menge von Stottern und Buchhaltung, die ich lieber vermeiden.
- Ich könnte Ihnen ein design, einige Namenskonventionen, und Sie könnten erzeugen eine Feder, ohne Intim zu sein mit der Umsetzung.
- 8 Monate später, habe ich beschlossen zu Graben, ein wenig. Dies ist nicht eine komplette Lösung, aber wenn Sie auf ein Objekt, dass Sie als barrierefrei gekennzeichnet sind, können Sie Lesen Sie das Etikett über "[lbl accessibilityLabel];" Es könnte ein Anfang für jemand.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie auf jeden Fall laden Sie die Stiftspitze aus, programmgesteuert, finden Sie alle Objekte und Abfrage Sie arbeiten heraus, welche Punkte für was. Schauen Sie sich nur Laden Der Nib-Dateien Programmgesteuert. Aber das problem ist, dass der Interface Builder Identität Name ist nicht ausgesetzt, die außerhalb der IB. Also ich bin mir nicht sicher, was würden Sie als die "forLabel" - parameter. Der "Name" - Feld ist nur eine Bequemlichkeit für die IB-Dokument-Fenster. Es ist nicht eine Eigenschaft, die auf
NSObject
.Name ist 100% nicht zugänglich, sobald das Objekt geladen wird, etwas, das ich immer dachte, war seltsam.
Was zugänglich ist, ist "tag", wenn Sie wirklich wollen, um den Zugriff auf ein element ohne die Festlegung eines outlet Sie können das (ganze nur) "tag" - Wert, und dann innerhalb der superview, das hält die tagged element nennen
viewWithTag:
vorbei in die gleiche ganze Zahl. Vergessen Sie nicht, die Standardeinstellung ist "0" also etwas anderes verwenden.Kann es geschehen, dass der element-tag:
Können sagen, Sie haben UIView xib-Datei namens "yourView" und drin gibt es UILabel, dass Sie darauf zugreifen möchten, ohne Verkabelung.
UILabel* yourlabel =(UILabel*) [yourView viewWithTag: 100];
//do whatever you want to your label.
Denke ich, können Sie versuchen, öffnen Sie die xib-in einigen externen editor wie XML und sehen, wie der compiler sieht, dann haben Sie vielleicht das gleiche tun wie
Für iOS6+, die Sie verwenden können restorationId statt-tag, um zu machen es mehr "lesbar", zum Beispiel können Sie die gleichen Namen in Ihre nib-Datei und in der Restaurierung-id.
Wenn Sie nicht möchten, verknüpfen Sie alle Filialen aus deiner Feder zu Ihrem viewcontroller, den Sie immer noch Zugriff auf Sie durch die Suche in der aktuellen Ansicht Unteransichten Baum. Beachten Sie, dass Untersichten Anordnung ist ein Baum, (der gleiche Baum, den Sie sehen können, in Ihre nib-Datei), so dass Sie brauchen, um einige der Rekursion, wenn Sie verschachtelte Ansichten.
Beispiel:
In Ihre nib-Datei Sie haben, sollten Sie eine Schaltfläche mit einem restorationId gleich "myNibButtonView", finden Sie die restorationId textfield-Objekt in der identity inspector (Dritte Spalte von utilities)
Können Sie dies verwenden, wenn Sie haben eine große Anzahl von outlets ein, die Sie nicht wollen, um mit ihm verknüpft alle.