Laden der nib-Datei in einem UIViewController
Bin ich zu Experimentieren, wie das laden der nib-Dateien in einem UIViewController
.
Habe ich einen separaten nib-Datei namens E-Mail. Zuerst habe ich bemerkt, dass, wenn der view-controller geladen wird, die initWithNibName
Methode ist nicht immer genannt. Also rief ich ihn aus der viewDidLoad
Methode manuell wie diese,
[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];
Es hat nicht funktioniert. Auch bekam ich eine Warnung, die sagen Ausdruck Ergebnis unbenutzt.
Und ich suchte im internet und stieß auf diese Artikel und implementiert die loadView
beschriebene Methode so
- (void)loadView
{
[super loadView];
UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
[nib instantiateWithOwner:self options:nil];
}
Die Methode aufgerufen wird, wird aber immer noch der Ansicht-controller ist leer!!!
Kann mir jemand sagen, was ich mit Blick auf hier und wie das getan werden kann?
Danke.
UPDATE:
Zuerst mal danke für alle Antworten. Allerdings voromax und svena's Antworten zeigen, dass ich abnehmen sollte und leitet über load-Federn automatisch die ich bin nicht sehr gern. Anil Antwort gesucht und jetzt habe ich noch eine Letzte Hürde zu springen.
Habe ich mehrere nib-Dateien. Je nach Auswahl des Benutzers, sollte es laden einer bestimmten Spitze. Also, was ich versucht habe, war, alle Federn im inneren des Arrays, wie so,
- (void)loadView
{
[super loadView];
NSArray *nibs = [[NSArray alloc] initWithObjects:
[[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil],
[[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil],
[[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil],
[[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil];
self.view = [nibs objectAtIndex:0];
}
und greifen Sie über den index wie das self.view = [nibs objectAtIndex:1];
. Aber es wirft eine Fehlermeldung *Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM _setViewDelegate:]: unrecognized selector geschickt Instanz 0xd56fd20'*
Warum ist dieser Fehler kommen? Wenn es nicht mehr möglich, ich bin offen für Vorschläge.
Nochmals vielen Dank. Und sorry für ein bisschen ziehen diese ein wenig.
InformationsquelleAutor Isuru | 2013-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie den folgenden code zum laden einer view aus der nib und die Verwendung als view-controller view
Bearbeiten
Laden einer einzelnen Feder entsprechend der Benutzer-Auswahl. Finden Sie unter laden von einer einzigen Feder
wird gibt ein array von Objekten. Aus der aktualisierten Frage, kann ich sehen, den Sie speichern diese arrays in ein anderes array. Jetzt ist Ihre nib-array ist ein array 'array' - Objekte.
arbeiten.
Aber es ist nicht gut, einlegen einer einzelnen Feder entsprechend der Benutzer-Auswahl
self.view = [nibs objectAtIndex:1];
. Aber es wirft eine Fehlermeldung Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM _setViewDelegate:]: unrecognized selector geschickt Instanz 0xd56fd20' übersehe ich hier etwas oder gibt es einen anderen Weg, um darüber zu gehen?Kannst du deinen code zusammen mit der Frage? Ich kann nicht zugreifen, die Seite. Tatsächlich ist die Feder array zurückgibt, indem Sie die loadNib enthält nicht nur s, es enthält alle Bedienelemente, die in Ihrer Spitze(buttons/ label..) objectAtIndex[0] wird die top-level-Objekt(wahrscheinlich ein Blick, wenn man einzelne anzeigen per Feder). Mit aus zu sehen, Ihr code kann ich nicht sagen, genau das problem
Ich aktualisiert meine Frage oben.
siehe mein edit
Wenn man beim laden der nib-um-Ansicht, der Ansicht sein sollte, eine benutzerdefinierte Ansicht. Sie haben, um aus der Bindung an die eigene Klasse nicht zu den Dateien, die Eigentümer (- view-controller). Dann die Kommunikation s/w-anzeigen und controller delegieren. Dies ist eine Lösung verwendet, wenn ein view-controller kann mehr als einen Blick, um zu behandeln, Ansicht kann variieren, abhängig von einer Bedingung(iphone/ipad).Ich nicht lieber diese Methode, da es sehr kompliziert ist. Ansonsten separate view-controller für jede Ansicht ist besser. Aber die OP wirklich will, das er gehen kann mit dieser Lösung
InformationsquelleAutor Anil Varghese
Sie sollten nicht zum laden einer Feder für den view-controller aus in die Methoden des view-Controllers.
Wenn Sie wollen, instanziieren Sie ein view-controller aus der Feder, Sie tun, aus außerhalb des view-Controllers in der Regel die Ansicht-controller, präsentiert.
Wenn Sie sind auf der Suche nach einem Haken nach innen präsentiert-view-controller, dass würde bereits der outlet-verbindungen einrichten, überschreiben
-awakeFromNib
ist eine beliebte Wahl.-viewDidLoad
ist eine andere.Update #1
UITableViewController
als das Vorherige view-controller, so dass ich versuchte, laden Sie die Feder beim instanziieren es kurz vor dem übergang passiert.NewMailViewController *newMailVC = [[NewMailViewController alloc] initWithNibName:@"Email" bundle:nil]; newMailVC = [segue destinationViewController];
Aber es hat nicht funktioniert.Aus deinem Kommentar schließe ich Sie mit storyboards. Storyboards instanziieren der view-Controller, für Sie und Sie nicht laden Sie diese Federn selbst. Gibt es einen Grund, warum Sie möchten, gehen Sie zurück zu dem laden von der Spitze aus mit storyboard?
Ja, ich bin mit Storyboards. Sorry, ich sollte erwähnt haben, dass in der Frage. Das Szenario ist wie folgt. Ich bin erstellen einer benutzerdefinierten E-mail-app, und es gibt mehrere E-mail-Typen. Für jeden mail-Typ, das UI ist anders. Also, was ich Tat, war, erstellen Sie eine separate Feder für jeden mail-Typ, haben Sie eine
UITableViewController
um die Liste der E-mail-Typen und-wenn es leitet über, je nach Auswahl des Benutzers lädt er die spezifischen nib-Datei, um eineUIViewController
.Vielleicht nicht die "schönste" Lösung, aber ja, Sie müssen kündigen, der Wechsel (wie @voromax vorgeschlagen) und dann instanziieren von Feder manuell. Aber nicht nur instanziieren, sondern auch schieben Sie es in die navigation stack oder präsentieren. Init in sich selbst ist nicht genug,
in Ihrem Fall ist es besser, es zu schaffen, alle view-Controller in einem storyboard, überspringen Sie die harte segue Bindung und Nutzung
instantiateViewControllerWithIdentifier:
Methode Ihrer segue-Instanz zu erhalten, die entsprechenden view-controller und stellen Sie ihn manuell einInformationsquelleAutor svena
Sollten Sie die nib-Datei zu instanziieren der view-controller selbst ich. e.
Danach präsentieren Sie diese controller
Update
Im Falle dass, wenn Sie brauchen, um wählen Sie die view-controller geladen werden soll, wird von der Anwendungslogik ist es besser, es zu schaffen, alle view-Controller in einem storyboard, überspringen Sie die harte segue Bindung und Nutzung
instantiateViewControllerWithIdentifier:
Methode des " storyboard-Instanz zu erhalten, die entsprechenden view-controller und stellen Sie ihn manuell ein. Ich gehe davon aus, dass Ihre Tabelle view-controller ist bereits in der navigation-controller:UITableViewController
als das Vorherige view-controller, so dass ich versuchte, laden Sie die Feder beim instanziieren es kurz vor dem übergang passiert.NewMailViewController *newMailVC = [[NewMailViewController alloc] initWithNibName:@"Email" bundle:nil]; newMailVC = [segue destinationViewController];
Aber es hat nicht funktioniert.Sie könnte Abbrechen dieser übergang von
– shouldPerformSegueWithIdentifier:sender:
Rückkehr NICHT und laden Sie Ihre controller manuellInformationsquelleAutor voromax