Question

Mon code est divisé en deux implémentations principales:. MenuController.m et AppController.m, chacun avec des fichiers d'en-tête

J'ai préférences utilisateur couple, qui sont stockés à l'aide NSUserDefaults, et changé par NSMenuItems afin qu'ils présentent des marques de contrôle lorsqu'il est activé (en utilisant setState: NSOffState ). Il n'y a qu'un peu de mon manque setup- je besoin de l'application setState pour les éléments de menu au démarrage si les options sont sur les prefs. Cependant, la seule façon que je sais quelque chose ensemble sur le lancement de l'application est de l'avoir dans les awakeFromNib méthode, et qui est dans le AppController et ne peut pas accéder à la NSMenuItem instanciée le MenuController.

Je suis assez nouveau à Objective-C, et ont réussi à obtenir ce loin grâce à de nombreux tutoriels utiles et des réponses sur ce site, mais en ce moment je suis juste perplexe.

Je l'ai essayé d'utiliser des méthodes de classe et d'objet pour modifier les paramètres, mais ont besoin failed- I d'utiliser l'instance existante des NSMenuItems. validateMenuItem avait l'air prometteur, mais il permet seulement et menus adaptés aux personnes handicapées et ne setState.

Code pertinent (je pense):

de MenuController.h:

@interface MenuController : NSMenu {
 IBOutlet NSMenu *optionsMenu;
 IBOutlet NSMenuItem *onTopItem;
 IBOutlet NSMenuItem *liveIconItem;
}

- (IBAction)menuLiveIconToggle:(id)pid;

de MenuController.m: (méthode pour changer prefs et setState- fonctionne très bien)

- (IBAction)menuLiveIconToggle:(id)pid; {
 //NSLog(@"Live Icon Toggle");
 NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
 if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE){
  [standardUserDefaults setBool:FALSE forKey:@"LiveIcon"];
  [liveIconItem setState: NSOffState];
 } else {
  [standardUserDefaults setBool:TRUE forKey:@"LiveIcon"];
  [liveIconItem setState: NSOnState];
 }
 [standardUserDefaults synchronize];
}

de AppController.m: (ne fonctionne pas, mais cela est l'essentiel de celui-ci)

- (void) awakeFromNib{
 // Update menu items
 if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE) {
  [liveIconItem setState: NSOnState];
 } else {
  [liveIconItem setState: NSOffState];
 }
}

Merci pour toute aide!

Était-ce utile?

La solution

Il y a plusieurs façons dont vous pouvez y parvenir. Tout d'abord, vous pouvez simplement déplacer votre implémentation awakeFromNib dans votre classe MenuController, où vous avez accès aux points de vente. awakeFromNib n'est pas spécifique au délégué App, mais disponible pour tous les objets qui sont chargés de Nibs (que vous avez prises dans votre MenuController, je suppose qu'il est chargé d'un Nib).

Vous pouvez également mettre en œuvre validateMenuItem :, toujours revenir OUI, mais également définir l'état de l'élément de menu qui vous est donné comme paramètre.

Ou, se débarrasser de tout le code et il suffit d'utiliser les liaisons dans Interface Builder. Vous pouvez lier la « valeur » (== état) de votre élément de menu à « contrôleur par défaut Les utilisateurs partagés » et entrez « LiveIcon » comme le chemin de clé modèle. Vous pouvez supprimer tout le code que vous avez posté et il vous reste plus qu'à travailler.

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