9

Ich werde versuchen, dies so kurz wie möglich zu machen.Verschachteln benutzerdefinierter Klassen/XIBs mit Interface Builder

Ich schrieb eine benutzerdefinierte Klasse, die UIView mit ein paar IBOutlet-Eigenschaften erweitert, und es hat ein XIB zugeordnet, wo diese IBOutlets verknüpft sind.

Ich möchte dann diese Klasse nehmen, in ein anderes XIB einbetten (zum Beispiel eine Tabellenzelle), und es einfach funktionieren lassen.

Es scheint, dass, wenn ich diese benutzerdefinierte Klasse in die neue XIB einbetten, es nicht die ursprüngliche XIB I zugeordnet erkennt, so fordert es mich auf, die IBOutlets auf die Elemente der Benutzeroberfläche auf der neuen XIB zurückzusetzen. Das ist langweilig.

Versteht jemand, was ich versuche zu tun und einen guten Ansatz zu haben?

Antwort

8

Hier ist, wie ich diese Arbeit machen verwaltet:

In Interface Builder
Ihre äußere Feder öffnen und dies tun:

  • ein UIView Fügen Sie den Raum zu definieren, in dem Sie Ihre innere Feder zur Anzeige.
  • Fügen Sie ein UIViewController-Objekt aus der Bibliothek hinzu, und legen Sie die Eigenschaft Nib Name auf den Namen der inneren NIB-Datei (ohne die Erweiterung) fest.
  • Erstellen Sie IBOutlets für diese beiden Elemente in Ihrem Controller für die Außenansicht und verkabeln Sie sie. (Ich werde als InnerView- auf sie verweisen und innerViewController.)
  • Schließen Sie keine der IBOutlets in Ihrem inneren View-Controller etwas definiert in Ihrer äußeren Nib-Datei, so dass sie nur unverbundene verlassen.

In Xcode
In Ihrem äußeren viewDidLoad Methode des View-Controller, fügen Sie diese beiden Zeilen:

[self.innerView addSubview:self.innerViewController.view]; 
self.innerViewController.view.frame = CGRectMake(0, 0, self.innerView.frame.size.width, self.innerView.frame.size.height); 

Wenn Ihre äußere Spitze eine benutzerdefinierte UITableViewCell ist, setzen Sie diese Zeilen in Ihrem awakeFromNib Methode stattdessen.

Build & Ausführen!

+0

Es funktioniert auf OS X genauso, ersetzen Sie einfach die UI-Klassen durch ihre NS-Gegenstücke. – Mark

1

Ich nehme an, Sie setzen UIViews einfach in eine Nib für die Verwendung von einem UIViewController, der rein in Code ist. Apple nennt dies eine detached nib file.

Folgen Sie der Anleitung, für die ich verlinkt bin, um Details und ein Beispiel dafür zu erhalten, wie Sie dies zum Laufen bringen können.

Zum Einbetten einer Ansicht in eine andere in Interface Builder müssen Sie add a UIView element from the Library in die übergeordnete Ansicht und set its class in the Inspector. Sobald die Klasse der eingebetteten Ansicht festgelegt ist, sollten Ihre IBOutlets sichtbar sein.

+1

Dieser erste Satz ist nicht ganz, was ich tue. Die Klasse selbst ist eine UIView und enthält einen UIImageView- und einen UIActivityIndicator. Der letzte Satz ist richtig, aber leider verhält es sich nicht richtig. Es hebt die IBOutlets auf. –