Hallo,
meine Anwendung verteilt sich auf recht viele Nibs. Bin dazu übergegangen den "Files Owner" zu optimieren. In der Regel ist das ja ein einfacher von NSObject abgeleiteter Controller - so auch bei mir. Dann hab ich mir mal angeschaut, welche Aufgaben ich in den Controllern oft erledige und ob ich die nicht zusammenfassen könnte.
Ich habe einige Dinge gefunden:
In nahezu jedem Controller einer Nibfile erledige ich folgende Aufgaben:
* irgendwelche Dinge binden
* ein NSWindow an die Front beordern oder das NSWindow als Sheet öffnen
* bindings eventuell wieder entfernen
* das NSWindow/Sheet schließen
NSWindowController konnte mir einiges an Arbeit abnehmen - allerdings nicht alles. Daher habe ich mich entschieden einen NSWindowSubclass zu machen, den dann alle Files Owner wieder subclassen.
Nun habe ich ein NSWindowController Subclass, der mir wie folgt hilft, wenn ich ihn als Files Owner Subclass:
Implementiere ich:
Wird logischerweise automatisch die entsprechende Nib geladen.
Frage: NSWindowController hat auch ein init dafür:
Ich initialisiere meine Windowcontroller aber immer mit [[MeinWindowController alloc] init]. Mir gefällt es nicht, dass mein Hauptcontroller, der alle anderen WindowController kennt auch noch deren Nibnamen kennen muss. Allerdings muss die initWithWindowNibName auch einen Sinn haben, den ich momentan nicht sehe. Außerdem habe ich in fremdem Code gesehen, dass eigentlich nur mit initWithWindowNibName gearbeitet wird und dem Subclass die Arbeit abgenommen wird.
Zweite Frage: Mein NSWindowController Subclass, der von allen anderen NSWindowController gesubclassed wird hat eine methode setIsSheet:(BOOL). Zusätzlich dazu hat er eine Action: hide:. Ist isSheet == YES, dann öffnet der Controller das zugewiesene NSWindow als sheet, sobald showWindow: aufgerufen wird. Ist dies nicht der fall wird [super showWindow:] aufgerufen. Bei hide: ebenso nur, dass da das Fenster natürlich verschwindet - entweder als sheet oder als Fenster. Ist das ein gangbarer Weg? Zu umständlich gemacht?
Dritte Frage: Früher hatte ich in meinen inits/awakeFromNibs alles möglich untergebracht, was da eben so reingehört. Das habe ich schon vor einigen Monaten geändert. Jedes awakeFromNib sah in etwa dann so aus:
Nun habe ich einfach in meinen "abstrakten" NSWindowControllerSubclass zwei Methoden definiert nämlich setupUI und setupBindings, die er automatisch aufruft, sobald es zeit dazu ist.
In meinen konkreten NSWindowControllerSubclasses kann ich dann einfach je nach bedarf setupBindings bzw. setupUI implementieren oder es sein lassen. Erachtet ihr das eher als sinnvoll? Last? Umständlich?
Ich hoffe ich liege mit meinen Strategien mir das Leben einfacher zu machen nicht ganz falsch. Aber ihr wisst, dass ich nicht so die Erfahrung mit Cocoa habe und ich bin mir sicher, dass ich vieles zu umständlich gemacht habe. Wäre schön, wenn man das hier ausräumen könnte.
Wie geht ihr mit diesen immer wiederkehrenden Dingen um?
meine Anwendung verteilt sich auf recht viele Nibs. Bin dazu übergegangen den "Files Owner" zu optimieren. In der Regel ist das ja ein einfacher von NSObject abgeleiteter Controller - so auch bei mir. Dann hab ich mir mal angeschaut, welche Aufgaben ich in den Controllern oft erledige und ob ich die nicht zusammenfassen könnte.
Ich habe einige Dinge gefunden:
In nahezu jedem Controller einer Nibfile erledige ich folgende Aufgaben:
* irgendwelche Dinge binden
* ein NSWindow an die Front beordern oder das NSWindow als Sheet öffnen
* bindings eventuell wieder entfernen
* das NSWindow/Sheet schließen
NSWindowController konnte mir einiges an Arbeit abnehmen - allerdings nicht alles. Daher habe ich mich entschieden einen NSWindowSubclass zu machen, den dann alle Files Owner wieder subclassen.
Nun habe ich ein NSWindowController Subclass, der mir wie folgt hilft, wenn ich ihn als Files Owner Subclass:
Implementiere ich:
Wird logischerweise automatisch die entsprechende Nib geladen.
Frage: NSWindowController hat auch ein init dafür:
Ich initialisiere meine Windowcontroller aber immer mit [[MeinWindowController alloc] init]. Mir gefällt es nicht, dass mein Hauptcontroller, der alle anderen WindowController kennt auch noch deren Nibnamen kennen muss. Allerdings muss die initWithWindowNibName auch einen Sinn haben, den ich momentan nicht sehe. Außerdem habe ich in fremdem Code gesehen, dass eigentlich nur mit initWithWindowNibName gearbeitet wird und dem Subclass die Arbeit abgenommen wird.
Zweite Frage: Mein NSWindowController Subclass, der von allen anderen NSWindowController gesubclassed wird hat eine methode setIsSheet:(BOOL). Zusätzlich dazu hat er eine Action: hide:. Ist isSheet == YES, dann öffnet der Controller das zugewiesene NSWindow als sheet, sobald showWindow: aufgerufen wird. Ist dies nicht der fall wird [super showWindow:] aufgerufen. Bei hide: ebenso nur, dass da das Fenster natürlich verschwindet - entweder als sheet oder als Fenster. Ist das ein gangbarer Weg? Zu umständlich gemacht?
Dritte Frage: Früher hatte ich in meinen inits/awakeFromNibs alles möglich untergebracht, was da eben so reingehört. Das habe ich schon vor einigen Monaten geändert. Jedes awakeFromNib sah in etwa dann so aus:
Nun habe ich einfach in meinen "abstrakten" NSWindowControllerSubclass zwei Methoden definiert nämlich setupUI und setupBindings, die er automatisch aufruft, sobald es zeit dazu ist.
In meinen konkreten NSWindowControllerSubclasses kann ich dann einfach je nach bedarf setupBindings bzw. setupUI implementieren oder es sein lassen. Erachtet ihr das eher als sinnvoll? Last? Umständlich?
Ich hoffe ich liege mit meinen Strategien mir das Leben einfacher zu machen nicht ganz falsch. Aber ihr wisst, dass ich nicht so die Erfahrung mit Cocoa habe und ich bin mir sicher, dass ich vieles zu umständlich gemacht habe. Wäre schön, wenn man das hier ausräumen könnte.
Wie geht ihr mit diesen immer wiederkehrenden Dingen um?
Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.
Objective-C und Cocoa Band 2: Fortgeschrittene
Cocoa/Objective-C Seminare von [co coa:ding].
Objective-C und Cocoa Band 2: Fortgeschrittene
Cocoa/Objective-C Seminare von [co coa:ding].