So che la domanda originale era per Objective-C, ma per altri che usano Swift, i protocolli possono aiutare. Il concetto di base può essere applicato anche in Objective-C.
Invece di raggiungere di nuovo al controller della finestra, è possibile utilizzare l'iniezione di dipendenza:
1) Creare una proprietà document
sul controller finestra e qualsiasi controller di vista che hanno bisogno di accedere al documento (o utilizzare la proprietà representedObject
che esiste già). Per semplificare l'operazione, è possibile utilizzare un protocollo per definire la proprietà del documento o per assegnare la proprietà representedObject
al tipo di documento se si utilizza tale percorso. Fai in modo che tutti i controller di vista che devono accedere al documento adottino questo protocollo.
protocol DocumentAccessing {
var document: MyDocument? { get set } // could also use an implicitly unwrapped optional if the document is required to be set for the app to function
}
2) Nel metodo del documento sottoclasse makeWindowControllers()
, dopo aver creato il controller finestra, impostare la sua proprietà del documento a sé (in quanto questo è il documento).
- (void)makeWindowControllers {
MyWindowController *windowController = MyWindowController()
windowController.document = self;
[self addWindowController:windowController];
}
3) Dentro il controller finestra sottoclasse, dopo si istanzia i controller di vista, impostare la proprietà del documento del controller vista proprietà del documento del controller finestra.
4) Ora quando viene caricato il controller di visualizzazione, è necessario inserire le proprietà del documento.
come implementare '-makeWindowControllers' di NSDocument? chiama '-addWindowController:' come un modello predefinito? – bluedome
sì è implementato come follwos: - (void) makeWindowControllers { // Override per restituire il nome del file Storyboard del documento. [self addWindowController: [[NSStoryboard storyboardWithName: @ "Main" bundle: nil] instantiateControllerWithIdentifier: @ "Document Window Controller"]]; } – Martin
dove inserisci il codice '[self.view.window.windowController document]' nella sottoclasse di NSViewController? – bluedome