Domanda

Questo sembra che dovrebbe essere facile ma devo essere manca qualcosa. Ho un'applicazione basata su documenti. Ho anche costruito un nuovo XIB che ha un NSTableView e tre pulsanti su di esso che ho intenzione di visualizzare un elenco di file precedenti. Vorrei che questo XIB da visualizzare al posto della finestra del documento quando l'applicazione inizia prima. Una volta che l'utente seleziona un vecchio file o preme il pulsante "Nuovo" Vorrei quindi passare alla finestra del documento. Questo è molto comune e che ho visto usato molto spesso.

Nei miei tentativi per ottenere questo lavoro ho modificato il file di progetto-info.plist e ha cambiato il file principale NIB Nome Base da myDocument al mio nome Selezione XIB. Questo fa sì che l'applicazione per visualizzare la finestra di selezione al posto della finestra myDocument. Sembra che ci sia nessun problema fino a questo punto.

Nella mia finestra Selezione ho impostato la mia vista tabella e un controller di array e un controller finestra personalizzata proprio per questo XIB. Ho impostato il proprietario del file al nuovo controller finestra e vincolati proprietà della finestra del controller finestra per finestra e la proprietà delegato della finestra per proprietario del file, così come il "Select", "Annulla", e pulsanti "Nuovo". Nulla è destinata a NSApplication. Ma la cosa strana è quando faccio funzionare questa applicazione sembra voler collegare questi controller a NSApplication con l'errore (lo stesso per gli altri due pulsanti):

Non è stato possibile collegare il selectButton azione: al bersaglio di classe NSApplication

Inoltre, visualizza un errore che non è NSApplication Valore-chiave compliant per la presa che detiene riferimento alla mia matrice. I controller di array, Finestra e pulsanti non sono tenuti a NSApplication ma al nuovo controller Window. Mi sarei aspettato che se ci fosse qualche problema non sarebbe parlare NSApplication ma piuttosto il controller finestra per cui i controllori sono vincolati.

Qualcuno sa che cosa sta accadendo qui? È questo un problema Obiettivo-Azione perché ho cambiato il "file principale NIB Nome Base" dal "Menu principale" a "Selezione"? Se io non dovrei cambiare questo, allora come posso ottenere cacao mi permette di visualizzare una schermata di selezione prima di mostrare la finestra del documento?

Ogni aiuto è molto apprezzato. Rob

È stato utile?

Soluzione

L'impostazione in IB per la classe del proprietario del file del pennino è solo consultivo; permette IB mostrare solo i punti vendita e le azioni che vengono forniti da istanze di quella classe. Esso non impone che il proprietario del file sarà un'istanza di quella classe, perché il proprietario del file non è parte del pennino.

Il proprietario del file è l'oggetto che si carica il pennino. Questo necessariamente significa che è al di fuori del pennino, e nulla nel pennino determina nulla al riguardo. Nel caso del pennino MainMenu, del suo file proprietario, l'oggetto che carica il MainMenu pennino è la esempio NSApplication. Quindi, tutto quello che collegato al proprietario del file nel vostro pennino MainMenu, è collegato all'oggetto di applicazione, anche se detto IB che non sarebbe l'applicazione.

Che l'applicazione è il proprietario del MainMenu pennino indipendentemente da quello che dici di non IB-è il bug. L'applicazione è sempre il proprietario del pennino MainMenu. Questo è normale e corretto; Non si può cambiare, non dovrebbe tentare di cambiarlo, e non c'è bisogno di cambiarlo.

Il bug, in poche parole, è che si sta utilizzando un pennino per due scopi molto diversi.

Si dovrebbe lasciare il MainMenu pennino in essere che da sola contenenti solo il MainMenu, il controller documento personalizzato (ne parlerò più che in un momento), e la vostra applicazione delegato e spostare i precedenti documenti-finestra in un pennino in separata , di proprietà del controllore finestra precedente-documenti. Al fine di avere un controller finestra di essere il proprietario di questa pennino, è necessario avere il carico di controllo finestra di esso. È necessario farlo in code-non è possibile impostare che fino a IB o in un plist.

Nel dell'applicazione delegato, istanzia e si possiede il controller finestra. Suona come hai fatto un NSWindowController sottoclasse personalizzata, in modo da poter ignorare la sua init di avere essa stessa inviare il messaggio initWithWindowNibName: a carico e proprio il pennino. Poi, basta usare alloc e init per creare il controller finestra dal delegato app.

che sbarazzarsi del messaggio console, e garantire che i pulsanti sono in realtà collegato al controller finestra (perché sono fino agganciato al proprietario del file, che, con questo cambiamento, sarà il controller finestra).

la tua app delegato rispondono al applicationOpenUntitledFile: inviando la finestra di controllo il messaggio showWindow:. Questo renderà la finestra precedente-documenti compare ogni volta che l'utente normalmente avrebbe creato un nuovo documento.

Se si desidera supportare i soliti metodi di creazione di documenti (vale a dire, consentire Nuovo documento per il lavoro), quindi implementare applicationDidFinishLaunching: e applicationShouldHandleReopen:hasVisibleWindows:, non applicationOpenUntitledFile:. Assicurarsi che nessun documento è aperto, e mostrano la finestra, se questo è il caso.

Si dovrebbe anche fare una sottoclasse personalizzata di NSDocumentController e rendere il documento di controllo un'istanza di questo, e in quella classe, implementare addDocument: e removeDocument: per ri-mostrare i precedenti documenti elettronici finestra quando l'ultimo documento aperto viene chiuso, e si nascondono quando un documento viene aperto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top