2010-10-07 3 views
5

Angenommen, ich habe ein XIB für eine Symbolansicht erstellt. Ich möchte dann eine Anzahl von Instanzen dieser Symbolansicht in eine andere XIB-Containeransicht durch Referenz einbetten. Wenn ich Eigenschaften/Layout in der ursprünglichen Symbolansicht XIB ändere, spiegeln die Instanzen in der Containeransicht XIB diese Änderungen wider .Verschachteln von XIBs in Interface Builder/Einbetten durch Referenz

Im Wesentlichen, Einbettung durch Bezugnahme.

Vielleicht bin ich dicht, aber es scheint das Standardverhalten von Interface Builder beim Ziehen einer Ansicht in eine Containeransicht ist, alles zu kopieren, anstatt auf die ursprüngliche XIB verweisen? Wenn Sie eine Instanz der Klasse, die mit der Symbolansicht verknüpft ist, in die Containeransicht ziehen, wird nur eine leere Ansicht angezeigt.

Ich bin sicher, es gibt einen Weg, dies zu tun, aber ich bin verdammt, wenn ich es herausfinden kann. Ich vermeide normalerweise IB wie die Pest;)

Antwort

5

Es gibt keine Möglichkeit, dies direkt in Interface Builder zu tun. Ich musste etwas ähnliches in meiner letzten App machen. Was ich getan habe, war nur eine Platzhalteransicht an der Stelle zu platzieren, an der Sie die referenzierte xib haben möchten, und dann in Ihrer viewDidLoad oder viewWillAppear, etc, laden Sie diese xib und platzieren Sie diese geladene Ansicht als Kind Ihrer Platzhalteransicht.

NSArray *views = [[NSBundle mainBundle] loadNibNamed: @"ReferencedView" owner: self options: nil]; 
UIView *referencedView = (UIView *)[views objectAtIndex:0]; 
[self.viewPlaceholder addSubview:referencedView]; 

Alternativ können Sie auch eine IBOutlet in Ihren View-Controller erstellen die referenzierte Ansicht zu halten und dass die Steckdose in IB zu verbinden. Wenn Sie dies tun, müssen Sie die Ansicht nicht aus dem NSArray ziehen.

0

Dies ist, wie ich es tat:

Beachten Sie, dass jetzt in iOS 5 sie bereits containerView haben. Soweit ich weiß, wird es in XIB nicht angezeigt. Die Essenz ist jedoch die gleiche.

Machen Sie eine Ansicht und rufen Sie diese ContainerView auf. Wenn du es im XIB-Stil machst, musst du einige Dinge manuell einstellen, wie z. B. Alloc] Initiere den untergeordneten View-Controller, füge ihn zum übergeordneten Element hinzu und füge die View der übergeordneten Ansicht hinzu.

Wenn Sie dies im Storyboard tun, können Sie von diesem ContainerView mit einem anderen Controller verknüpfen und ein Embed-Segment erstellen. Allerdings funktioniert es nur für einen View-Controller und Sie müssen das gleiche für den Rest.

Dann mache ich das:

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    PO(self.childViewControllers); 
    BGCRListBusinessViewController * theListController= [[BGCRListBusinessViewController alloc]init]; 
    self.listBusinessViewController = theListController; 
    [self addChildViewController:theListController]; 
... 
    for (UIViewController * child in self.childViewControllers) { 
     child.view.frame=self.ContainerView.bounds; 

    } 
    //PO(self.ChangeFilter.BackgroundImage); 
    //PO 
    //self.ChangeFilter setBackgroundImage:[UIImage imageNamed:@] forState:<#(UIControlState)#> 

    [self.ContainerView addSubview:self.listBusinessViewController.view];// initialize' 
} 

Tada ....

Schauen Sie sich nun, dass childViewControllers Sammlung. Das ist neu in IOS5. Alles was es tut, ist viewWillAppear, viewWillDisappear, ViewDidThisThat und ViewIamRotatingWillOrDidorWhatever zu übergeben. Es macht ein bisschen mehr, aber das ist mir egal.

Wenn Sie also nach IOS4 zielen, können Sie alle direkt in der übergeordneten AnsichtWillAppear, viewWillDisappear, ViewDidThisandThat und ViewIamRotatingWillOrDidorWayover aufrufen.

In meiner Implementierung habe ich einen Zeiger auf den ViewController hat die Ansicht innerhalb der ContainerView. Solche Ansichten erhalten alle diese ViewWillorDidWhatever-Funktion aufgerufen.

Meine Eltern Controller haben auch mehrere Kinder. Die meisten davon werden nicht gesehen. Kein Problem. Kinder, die nicht gesehen werden, erhalten ViewWillorDidWas auch immer.

Dies wird automatisch von childViewControllers durchgeführt. Wenn Sie nach IOS4 suchen, sehen Sie sich alle Ihre Kinder an, um die Ansicht der Controller anzuzeigen, und sehen Sie, ob eine von ihnen angezeigt wird. Wenn sie angezeigt werden, rufen Sie ViewWillorDidWhatever auf.

Es gibt auch einen zusätzlichen Delegaten, der benachrichtigt, ob ein Kind zu einem Elternteil hinzugefügt wird oder was auch immer. Ich habe das nicht benutzt und weiß nicht, wofür es gebraucht wird.

Schließlich einige Ansicht möchte vielleicht entlassen werden. Die Eltern sollten das tun. Ich erreiche das mit Benachrichtigung. Aber das ist schon jenseits der Frage. IOS hat bereits eine solche Funktion für ModalViewController.