2009-06-12 11 views
0

Ich habe eine relativ einfache App. Ich habe eine Vollbild-UIView-Unterklasse (musicGridView), mit der der Benutzer interagiert, und eine UIScrollView-Unterklasse (scrollView), in die diese Klasse geladen wird, sowie einen ViewController und mainWindow.xib.MVC: Wo Ansichten laden?

Momentan habe ich eine ViewController-Instanz in der nib geladen, die vom Typ myViewController ist. Die Nib hat auch eine Instanz von myUIView, auf die der myViewController zeigt.

In AppDelegate, ich dies tun:

[window addSubview:scrollView]; 
[scrollView addSubview: viewController.view]; 
scrollView.musicGridView = (MusicGridView*) viewController.view; 

was ich denke, ist falsch. Im Idealfall hat das appDelegate keine Instanz von scrollView.

In der AwakeFromNib-Klasse von scrollView führe ich die Initialisierung in der scrollView durch.

Ich denke, es sollte gehen, laden Sie das [window addSubview: viewController.view] in appDelegate, und zeigen Sie dann den ViewController auf eine Instanz von scrollView anstelle von musicGridView. Dann fügen Sie in scrollView watchFromNib eine Unteransicht von musicGridView hinzu.

Schließlich möchte ich eine andere Ansicht erstellen, die scrollView gehört und eigentlich eine seitliche TabBar ist (was mit den angegebenen APIs nicht möglich ist), die der Benutzer nach links scrollen kann, um zu erreichen.

Also ich denke, neben anderen MVC Zeug, die Frage ist, sollte der ViewController auf die ScrollView, die alle anderen Inhalt UIView Unterklassen enthält, einschließlich musicGridView?

+0

Also ... Ich habe es versucht, und bekomme nur einen leeren Bildschirm. Nicht sicher, wo ich falsch liege ... – Craig

Antwort

0

Es klingt, als ob Sie nicht mit Interface Builder Ihre UI entwerfen. Da dies ein neues Projekt ist, würde ich vorschlagen, dies zu tun. Sie sollten überhaupt keinen solchen Code schreiben müssen. Sie müssen jedoch Ihre Verkaufsstellen und Aktionen beschreiben.

Die zwei wichtigsten Dinge, die Sie im Umgang mit IB wissen müssen, sind die Schlüsselwörter IBOutlet und IBAction.

Sample-Klasse-Header:

@interface MyClass : NSObject { 
    IBOutlet UIScrollView* myScrollView; 
} 

- (IBAction) doWork; 

@end 

Jetzt können Sie diese zwei Dinge mit Interface Builder verdrahten von Quellen zu Zielen mit der Maus ziehen. YouTube hat viele Tutorialvideos zu IB, wenn du eine bessere Beschreibung dafür benötigst.

0

Ich bin jemand, der Interface Builder für UI-Design nicht verwendet; Meiner Erfahrung nach müssen Sie entweder All-IB oder All-Programmatic gehen. Um Ihr spezielles Problem zu lösen, benötigen Sie Ihr musicGridView als Instanz oder Erweiterung von UIScrollView.

Dies kann in Ihrer benutzerdefinierten viewController LoadView-Methode getan werden - einfach zu einem UIScrollView initialisieren (und Dinge hinzufügen), anstatt einer einfachen alten UIView.

jedoch, wie oben beschrieben, ist dieser Ansatz nicht kompatibel mit einem IB-zentrierten Ansatz, wie er in den UIViewController Class Reference

Alle Subklassen von UIViewController sollte die Loadview-Methode implementieren bestätigt die Ansicht zu setzen Eigenschaft , wenn Sie laden Sie Ihre Ansicht von einer Nib-Datei.