Démarrage d'une application basée sur le document Cocoa montre la fenêtre de sélection premier

StackOverflow https://stackoverflow.com/questions/3903264

Question

Cela semble comme il devrait être facile mais je dois manquer quelque chose. J'ai une application basée sur les documents. J'ai aussi construit une nouvelle qui a un XIB NSTableView et trois boutons sur ce que j'ai l'intention d'afficher une liste des fichiers précédents. Je souhaite que ce soit affiché XIB au lieu de la fenêtre du document lorsque la première application démarre. Une fois que l'utilisateur sélectionne un ancien fichier ou clique sur le bouton « Nouveau » Je veux aller ensuite à la fenêtre du document. Ceci est très fréquent et je l'ai vu utilisé assez souvent.

Dans mes tentatives pour obtenir ce travail, je l'ai modifié le fichier de projet info.plist et a changé le nom de base du fichier principal de NIB MyDocument à mon nom sélection XIB. Cela provoque l'application pour afficher la fenêtre de sélection au lieu de la fenêtre MyDocument. Il semble y avoir aucun problème à ce point.

Dans ma fenêtre de sélection je l'ai mis en place mon point de vue de la table et un contrôleur RAID et un contrôleur de fenêtre personnalisée juste pour ce XIB. J'ai mis propriétaire au nouveau contrôleur de fenêtre et lié la propriété de la fenêtre du contrôleur de fenêtre à la fenêtre et la propriété déléguée de la fenêtre au propriétaire, ainsi que les boutons « Select », « Annuler » et « Nouveau » du fichier du fichier. Rien n'est lié à NSApplication. Mais la chose étrange est quand je lance cette application, il semble vouloir relier ces contrôleurs à NSApplication avec l'erreur (même pour les deux autres boutons):

Impossible de connecter le SelectButton d'action: à la cible de la classe NSApplication

Il affiche également une erreur qui NSApplication est non conforme valeur-clé pour la sortie qui tient référence à mon tableau. Le contrôleur de réseau, la fenêtre et les boutons ne sont pas liés à NSApplication mais au nouveau contrôleur de fenêtre. Je me serais attendu que s'il y avait un problème est ne mentionnerait pas NSApplication mais le contrôleur de fenêtre à laquelle les contrôleurs sont liés.

Quelqu'un sait ce qui se passe ici? Est-ce un problème cible-action parce que je l'ai changé la « base du fichier principal NIB Nom » de « Menu principal » à « Sélection »? Si je ne suis pas censé changer cela, alors comment puis-je me Cocoa permet d'afficher un écran de sélection avant d'afficher la fenêtre du document?

Toute aide est grandement appréciée. Rob

Était-ce utile?

La solution

La mise en IB pour la classe du propriétaire de la pointe du fichier est uniquement consultatif; il permet à IB afficher uniquement les points de vente et les actions qui sont fournis par des instances de cette classe. Il n'applique pas que le propriétaire du fichier sera une instance de cette classe, parce que le propriétaire ne fait pas partie de la pointe du fichier.

Le propriétaire est l'objet qui charge la pointe du fichier. Ce signifie nécessairement qu'il est en dehors de la plume, et rien dans la plume détermine rien. Dans le cas de la pointe MainMenu, propriétaire-objet de son fichier qui charge le MainMenu nib est la par exemple NSApplication. Donc, tout ce que vous accroché au propriétaire du fichier dans votre nib MainMenu, vous accroché à l'objet d'application, même si vous avez dit IB que ce ne serait pas l'application.

Que la demande est le propriétaire du MainMenu nib, peu importe ce que vous dites IB-n'est pas le bug. L'application est toujours le propriétaire de la pointe MainMenu. Cela est normal et correct; vous ne pouvez pas changer, ne devrait pas tenter de le changer, et ne pas besoin de le changer.

Le bogue, en un mot, est que vous utilisez une pointe pour deux raisons très différentes.

Vous devez laisser le MainMenu nib être que seul contenant uniquement le MainMenu, votre contrôleur de document personnalisé (je vais arriver à cela dans un instant), et votre application délégué et déplacer la fenêtre précédente-documents dans une plume séparée , propriété du contrôleur de fenêtre précédente-documents. Afin d'avoir un contrôleur de fenêtre soit le propriétaire de cette nib, vous devez avoir la charge du contrôleur de la fenêtre il. Vous devez le faire dans le code que vous ne pouvez pas définir que dans IB ou dans un plist.

délégué de votre application, instancier et posséder le contrôleur de fenêtre. On dirait que vous avez fait une sous-classe NSWindowController personnalisée, de sorte que vous pouvez remplacer son init de l'avoir lui-même envoyer le message initWithWindowNibName: à la charge et de posséder la pointe. Ensuite, il suffit d'utiliser alloc et init pour créer le contrôleur de la fenêtre du délégué de l'application.

Cela va se débarrasser du message de la console, et faire en sorte que les boutons sont effectivement raccordés au contrôleur de fenêtre (parce qu'ils sont accrochés jusqu'à propriétaire, qui, avec ce changement, sera le contrôleur de la fenêtre du fichier).

Demandez à votre application répondre délégué à applicationOpenUntitledFile: en envoyant la fenêtre de commande du message showWindow:. Cela rendra la fenêtre précédente-documents apparaissent chaque fois que l'utilisateur aurait normalement créé un nouveau document.

Si vous voulez soutenir les méthodes habituelles de la création de documents (à savoir, permettre à un nouveau document de travail), puis mettre en œuvre applicationDidFinishLaunching: et applicationShouldHandleReopen:hasVisibleWindows:, non applicationOpenUntitledFile:. Assurez-vous qu'aucun des documents sont ouverts, et de montrer votre fenêtre si tel est le cas.

Vous devriez également une sous-classe personnalisée de NSDocumentController et de faire votre document contrôleur une instance de cela, et dans cette classe, mettre en œuvre addDocument: et removeDocument: à reétrenner la fenêtre précédente-documents lorsque le dernier document ouvert est fermé, et se cacher quand un document est ouvert.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top