Question

Je suis un n00b avec MacRuby et Cocoa, donc gardez cela à l'esprit lorsque vous répondez - Il me faut beaucoup de détails et d'explications. :)

Je l'ai mis en place un projet simple qui dispose de 2 fenêtres, ce qui les deux sont construits avec Interface Builder. La première fenêtre est une simple liste des comptes en utilisant une vue de tableau. Il a un bouton « + » en dessous de la table. Lorsque je clique sur le bouton +, je veux montrer une fenêtre « Ajouter un nouveau compte ».

J'ai aussi un AccountsController < NSWindowController et une classe de AddNewAccountController < NSWindowController, mis en place les délégués de ces fenêtres, les méthodes de clic sur le bouton appropriés câblés et points de vente pour référencer les fenêtres nécessaires.

Lorsque je clique sur le bouton « + » dans la fenêtre des comptes, j'ai ce feu de code:

    @add_account.center
    @add_account.display
    @add_account.makeKeyAndOrderFront(nil)
    @add_account.orderFrontRegardless

Cela fonctionne très bien la première fois que je clique sur le bouton +. Tout montre, je suis en mesure d'entrer mes données et avoir à lier mon modèle. Cependant, quand je fermer le programme sous forme de compte, les choses commencent à aller mal.

si je mets la fenêtre Ajouter une nouvelle compte pour libérer à la fermeture, puis la deuxième fois que je clique sur le bouton +, la fenêtre se encore en place, mais il est gelé. je ne peux pas cliquer sur les boutons, entrer des données, ou même fermer le formulaire. Je suppose que cela est parce que le code de formulaire a été libéré, donc il n'y a pas de boucle de messages traitement de la forme ... mais je ne suis pas tout à fait sûr à ce sujet.

Si je mets la fenêtre Ajouter une nouvelle compte pour ne pas libérer à la fermeture, puis la deuxième fois que je clique sur le bouton +, la fenêtre se présente bien et il est utilisable - mais il a encore toutes les données que j'avais déjà entré. .. il est toujours lié à mon exemple précédent compte de la classe.

ce que je fais mal? ce qui est la bonne façon de créer une nouvelle instance de la Ajouter un nouveau formulaire de compte, créez un nouveau modèle de compte, se lient ce modèle à la forme et montrer la forme, lorsque je clique sur le bouton + sur le formulaire des comptes?

... tout cela est fait sur Mac OS X 10.6.6, 64bit, avec XCode 3.2.4

Était-ce utile?

La solution

Le problème est que cela ne crée pas la fenêtre à chaque fois. Libération est un peu près d'une option ennuyeux et est utilisé généralement que si vous connaissez le contrôleur de fenêtre est également libéré lorsque la fenêtre se ferme. (Notez que je ne l'ai jamais utilisé MacRuby donc je vais donner le code dans Obj-C comme je sais qu'il est correct, je l'espère, vous pouvez le convertir. Je supposerai GC est comme il devrait être avec MacRuby).

Maintenant, il y a deux façons de le faire. Je ne suis pas tout à fait sûr comment votre NIB / classes sont mis en place comme il pourrait être l'une des deux façons.

-

La première façon de le résoudre est d'utiliser les points de vente que vous utilisez pour référencer les éléments de formulaire pour les vide lorsque vous affichez à nouveau la fenêtre par exemple [myTextField setStringValue: @ « »]. Si vous utilisez des liaisons de cacao, alors il est un peu plus délicat, mais au fond, vous devez vous assurer que l'objet lié est occultée. Je recommande que si les liaisons contre vous êtes nouveau à Cocoa.

-

La deuxième façon est de faire la classe AddNewAccountController une sous-classe de NSWindowController. Lorsque vous appuyez sur le bouton + vous créez une nouvelle instance de celui-ci et l'afficher (souvenez-vous de le stocker dans un Ivar). La meilleure façon de le faire serait comme ceci:

if (!addAccountController) {
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"];
    [[addAccountController window] setDelegate:self];
}
[addAccountController showWindow:self];

Cela permet d'éviter d'être fait une nouvelle instance si la fenêtre est déjà visible. Vous devez ensuite mettre en œuvre le délégué:

- (void)windowWillClose:(NSNotification *)notification {
    //If you don't create the account in the AddNewAccountController then do it here
    addAccountController = nil;
}

vous De toute évidence besoin de déplacer la fenêtre à une NIB séparée appelée « AddNewAccountController ». Dans ce NIB assurez-vous de définir la classe du propriétaire à AddNewAccountController puis de relier la sortie de la fenêtre du propriétaire du fichier dans la fenêtre du fichier.

Quand tout cela est mis en place, vous obtiendrez un contrôleur frais / fenêtre à chaque fois. Il a aussi l'avantage de se séparer et les contrôleurs en grué unités plus ciblées.

-

Une dernière chose. Alors qu'il est bien de faire quelque chose comme ça dans une fenêtre, vous pouvez regarder éventuellement à le faire via une feuille, car il serait alors d'éviter la possibilité de la fenêtre de compte ajouter se cacher derrière d'autres fenêtres.

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