2010-01-14 13 views
5

Ich denke, ich vermisse etwas Grundlegendes und so möchte ich die Community um etwas Hilfe bitten. Ich erstelle eine App, die auf einer grundlegenden iPhone Utility-Anwendung basiert. Mein MainView und FlipsideView teilen einige Elemente, also habe ich separate ViewControllers und Nib-Dateien für diese Teile erstellt. Um dies zu tun, habe ich folgendes getan: 1. Erstellt einen Viewcontroller namens searchDateViewController, der der Eigentümer der searchDateView.xib ist. 2. searchDateView.xib ist im Prinzip eine UIView mit einem UILabel darin, die View ist korrekt verkabelt 3. Innerhalb beide MainViewController.m und FlipsideViewController.m ich füge ein Subview als folllows:superview und parentviewcontroller nil nach dem Hinzufügen einer Unteransicht

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

Alles Displays und funktioniert gut. Grundsätzlich wird abhängig von den Aktionen, die in den Haupt- und Seitenansichten vorkommen, das UILabel der Feder geändert. Allerdings wollte ich etwas anderes machen, wenn der searchDateViewController aus dem MainView oder dem FlipsideView geladen wird. Ich kann jedoch nicht herausfinden, welcher ViewController die Unteransicht searchDateViewController hinzufügt.

In searchDateViewController Ich habe versucht:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

In beiden Fällen I Null zu bekommen.

Also meine Frage ist - kann ich herausfinden, welche ViewController SearchDateViewController eine Unteransicht hinzufügen? Wenn das so ist, wie? Oder wenn meine Logik hier völlig durcheinander ist, wie soll ich das machen?

Danke!

Antwort

2

viewDidLoad aufgerufen wird, wenn der View-Controller seine Ansicht geladen ist. In Ihrem Fall happends, dass in dieser Zeile:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

In diesem Moment haben Sie noch nicht addSubview: so nennen es kein Wunder, ist die Superview Sicht gleich Null ist.

Um Ihr Problem zu lösen, sollten Sie eine Eigenschaft in SearchDateViewController definieren, um zwischen den verschiedenen Fällen zu unterscheiden. Diese Eigenschaft würde dann vom übergeordneten Controller, der die SearchDateViewController-Instanz erstellt, entsprechend festgelegt.

Im Allgemeinen glaube ich nicht, dass es eine gute Idee ist, eine UIViewController-Unterklasse als Controller für eine Ansicht zu verwenden, die als Unteransicht einer oder mehrerer Vollbildansichten verwendet wird, anstatt selbst als Vollbildansicht verwendet zu werden. Ein Großteil der Logik von UIViewController basiert auf der Annahme, dass damit eine Vollbildansicht verwaltet wird. Zum Beispiel, mit Ihrem Design, ich denke, es ist möglich, dass SearchDateViewController den Rahmen der Ansicht ändern wird, wenn die Ausrichtung des Geräts etc. ändertDa Sie nicht alle diese Funktionen für eine Unteransicht ohne Vollbild benötigen, empfehle ich, dass Sie Ihren SearchDateViewController direkt von NSObject ableiten.

+0

Okay, danke, dass Sie mich in Bezug auf Subviews und UIViewController-Unterklassen in die richtige Richtung weisen. Wenn ich SearchDateViewController zu einer Unterklasse von NSObject mache, wie wird sich das auf die Art und Weise auswirken, wie ich die Subviews hinzufüge und mit der Nib einfüge? Ich habe keine Beispiele für Subviews als Objekte statt Viewcontrollers gefunden, aber ich möchte beginnen, zu übernehmen, was auch immer in diesem Fall üblich ist. Lass es mich wissen, wenn du weitere Tipps hast - danke! Auch - Sie beide vorgeschlagen, mit dem Elterncontroller, was sinnvoll ist, aber welche Rolle spielt Superview? Wäre das hier angemessener? – deadroxy

+0

Wenn Sie SearchDateViewController zu einer Unterklasse von NSObject machen, wird Ihr Problem nicht beseitigt, sondern nur zukünftige Probleme vermieden, da UIViewControllers nicht wirklich für Ansichten verwendet werden sollen, die nicht den gesamten IMHO des gesamten Fensters belegen. Um Ihr Problem zu lösen, sollte Ihr Ansichtsanpassungscode nicht auf self.parentViewController oder view.superview basieren. Definieren Sie stattdessen eine Eigenschaft in SearchDateViewController (könnte ein BOOL oder eine Enumeration sein), die Sie dann abfragen, um zu entscheiden, wie die Ansicht angepasst wird. Das Objekt, das den SearchDateViewController erstellt, sollte die Eigenschaft festlegen. –

+0

Ich habe genau wie Sie gesagt, eine Eigenschaft in der SearchDateViewController-Klasse erstellt, die gut funktioniert. Ich bin jedoch immer noch verwirrt darüber, wie man von UIViewController nach UIView/NSObject wechselt. Insbesondere wer wird der Besitzer der Datei von SearchDateView? Ich habe alles versucht und alles, was ich getan habe, führt zu Fehlern ... – deadroxy

-2

ViewController und Ansichten sind vollständig getrennt.

Wenn Sie einer übergeordneten Ansicht eine Unteransicht hinzufügen, fügen Sie in den meisten Fällen ihren Controller nicht dem viewController des übergeordneten Elements hinzu. Die Ausnahme von dieser Regel ist der Navigationscontroller, der anstelle der Ansicht den Controller hinzufügt, um eine Hierarchie von Ansichtscontrollern zu verwalten.

Ihr SearchDate viewController kann keinen übergeordneten Controller finden, weil Sie ihm nie einen zugewiesen haben, und das System führt dies nicht automatisch aus. Sie können einfach einen übergeordneten Controller zuweisen, wenn Sie die Ansicht von einem anderen Controller abrufen.

searchDateViewController.parentController=self; 
+0

Mein Verständnis ist, dass parentViewController ist nur fertig, so kann ich es nicht einstellen (tatsächlich bekomme ich einen Fehler, wenn ich es versuche). – deadroxy

+0

Schnelle Folge - Ich denke, Sie haben vielleicht gemeint, wie Ole es getan hat, um eine neue Eigenschaft innerhalb des SearchDateViewControllers zu erstellen, um diese Information zu speichern. Das funktioniert, aber ich habe immer noch Bedenken wegen Oles Kommentar zu dieser Strategie (der Verwendung von UIViewControllern als Subviews), die generell gegen gute Designprinzipien verstößt ... – deadroxy

+0

Ihr Recht, es ist nur lesbar. Ich nahm an, dass es gelesen/geschrieben wurde, weil der Navigationscontroller das Attribut setzt. Ich frage mich, wie der Navigationscontroller das Attribut setzt? Ole ist richtig, dass mehrere Controller auf dem gleichen sichtbaren Bildschirm ist eine schlechte Praxis. Die API unterstützt das nicht so einfach. – TechZen

Verwandte Themen