2009-07-17 13 views
1

Edited der Kürze halber:Nib Objekte (Subviews) Zugriff auf Objekte im Viewcontroller

Wie funktioniert ein Subview Zugriffseigenschaften in seiner Superview und View-Controller ist seine Superview? Einfach genug, um die Kette hinunterzugehen. Wie gehen wir zurück?

Original (ausführlich) Beitrag:

Das unmittelbare Problem Ich versuche, die „Geburt“ zu lösen, ist die Vereinfachung einer etwas komplizierten Ansicht. Das große Bild hat mit Nibs zu tun und wie Unterklassen (insbesondere von UIView), die über triviale Initialisierer hinausgehen, wiederhergestellt werden, wenn die Ansicht geladen wird.

Ich habe einige benutzerdefinierte UIViews - Subviews einer Unteransicht der Ansicht meines Viewcontrollers. Wenn ich diese Ansichten instanziiere, benötigen sie einen Verweis auf einige Eigenschaften (NSNumberFormatter, & NSDictionary) des View-Controllers.

Currenty Ich benutze eine Methode, um sie zu instanziieren:

- (id)initWithFrame:(CGRect)frame items:(NSDictionary *)dictionary forEditingMode:(EditingMode)mode 

Ich experimentiere mit ihnen in einem Nib bewegen sich ihnen rekonstituieren zu lassen und in grundlegende Design-Probleme läuft. Ein Wesen, ich denke, ich bin auf InitWithFrame als Standardinitialisierer beschränkt?!? Wenn ja, wie können diese Objekte in den übergeordneten View-Controller schauen und einen Verweis auf das Dictionary und einige andere Eigenschaften erhalten?

Gibt es Methoden, die ich innerhalb von initWithFrame aufrufen könnte (ähnlich denen, die den UIApplication-Delegaten abrufen), aber stattdessen der untergeordneten Ansicht ermöglichen würde, Methoden an die übergeordneten Ansichten und/oder Controller zu senden?

in der MVC Polizei schicken, ich bin sicher, dass ich etwas zu brechen ...

Antwort

0

Sie können Ausgänge einrichten, die die Ansicht der Superview oder View-Controller und ziehen Sie die Informationen in awakeFromNib vernetzen. Sie müssen awakeFromNib anstelle von init* verwenden, da die Verbindungen erst dann erstellt werden.

FYI, wenn Sie über eine Nib instanziieren, ist Ihr designierter Initialisierer initWithCoder:, nicht initWithFrame: (aber nicht für beide).

+0

also sagen Sie ein IBOutlet in diese Teilansichten, die zurück auf die Superview oder Viewcontroller verweist? Ich bin noch nicht darauf gestoßen ... ist das ziemlich häufig? – Meltemi

+0

Es ist im Wesentlichen das Delegiertenmuster.Sie geben der Unteransicht eine Steckdose mit dem Namen "delegate" und ein Delegate-Protokoll (in der Vergangenheit wäre dies informell, obwohl Sie jetzt ein formales Protokoll mit optionalen Methoden verwenden können). Dann machen Sie die Superview konform zum Protokoll. Schließlich legen Sie es als den Delegaten fest, entweder in IB oder mit einer Accessor-Nachricht. –

+1

Yup, wie Peter sagte, Ihr View-Controller wird im Grunde ein Delegat für die Unteransicht. Stellen Sie sicher, dass Sie dies zu einer "Zuweisungs" -Eigenschaft machen oder Sie erhalten einen Retain-Zyklus. –

1

Es sollte umgekehrt funktionieren.

Die Ansichten enthalten nur Steuerelemente (Textfelder usw.). Die Daten werden in einem Modell gespeichert, und die View/Window-Controller vermitteln, indem sie auf die Werte der View-Steuerelemente zugreifen und diese einstellen, indem sie mit dem Modell synchronisieren.

OK, manchmal müssen Sie möglicherweise ein Wörterbuch zwischen dem Controller und der Ansicht verwenden. Erstellen Sie anschließend eine Wörterbucheigenschaft in der Ansicht, und legen Sie sie in der wakeFromNib-Methode des Eigentümers der Schreibmarke fest.

0

Sie sollten dies wahrscheinlich manuell über den View-Controller tun, nachdem die Nib geladen wurde. Das bedeutet, dass Sie das gemeinsame Wörterbuch NACH die Ansicht initialisiert haben muss. Sie könnten es so machen:

@interface MyViewController : UIViewController { 
    IBOutlet MyView* view1; 
    IBOutlet MyView* view2; 
    IBOutlet MyView* view3; 
} 
@end 

@implementation MyViewController 

-(void) viewDidLoad; 
{ 
    NSDictionary* sharedDict = //make the shared dictionary here; 
    view1.sharedDict = sharedDict; 
    view2.sharedDict = sharedDict; 
    view3.sharedDict = sharedDict; 
} 

@end 
Verwandte Themen