0

FYI Je programme en objectif-C mais n'importe qui pourrait être en mesure d'aider. Je suis assis ici depuis deux heures essayant de comprendre quel est le problème et j'ai fait tout ce que je sais pour déboguer ce simple petit problème de codage. Découvrez le code ci-dessous et je vais vous expliquer. Dans l'application, il commence avec MainScreenViewController. Mon application donne à l'utilisateur deux choix ... choisir un bouton "maître" ou un bouton "travailleur" (modèle client-serveur de base). En fonction du choix de l'utilisateur, l'application est alors supposée charger une autre vue (MasterViewController ou WorkerViewController). Maintenant, quand je lance l'application, si vous avez suivi les commandes d'impression et hypothétiquement choisir le bouton "maître", alors dans mon programme, il imprime "masterButtonPressed - Stage 1" et "masterButtonPressed - Stage 2" mais rien d'autre. La vue ne change pas non plus ce qui m'indique que le problème réside dans le code dans la section AppDelegate. Après avoir placé les commandes d'impression et exécuté l'application, il n'imprime toujours pas les deux instructions que j'ai dans la section AppDelegate. J'ai les bonnes instructions # import dans les bons fichiers, je ne les ai pas inclus ici parce que cela prend de l'espace inutile. Je peux compiler le code sans erreur et sans avertissement. Théoriquement, ce que je devrais voir dans la console sont quatre lignes quand j'appuie sur le bouton "master" et elles sont (dans l'ordre) - "masterButtonPressed - Stage 1", "changeToMaster - Stage 1", "changeToMaster - Stage 2", et "masterButtonPressed - Étape 2". Quelqu'un peut-il indiquer où je me suis trompé? Comme je l'ai dit, la vue ne change jamais lorsque vous appuyez sur le bouton "maître". Merci de votre aide!Erreur logique ou mon programme ignore-t-il les pièces?

MainScreenViewController.h

@interface MainScreenViewController : UIViewController { 

} 

-(IBAction)masterButtonPressed; 
-(IBAction)workerButtonPressed; 
@end 

MainScreenViewController.m

@implementation MainScreenViewController 
-(IBAction)masterButtonPressed { 
    NSLog(@"masterButtonPressed - Stage 1"); 
    [ErwinAppDelegate changeToMaster]; 
    NSLog(@"masterButtonPressed - Stage 2"); 
    } 


-(IBAction)workerButtonPressed { 
    NSLog(@"workerButtonPressed - Stage 1"); 
    [ErwinAppDelegate changeToWorker]; 
    NSLog(@"workerButtonPressed - Stage 2"); 
} 
@end 

ErwinAppDelegate.h

@class MainScreenViewController, MasterViewController, WorkerViewController; 
@interface ErwinAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    MainScreenViewController *mainScreenViewController; 
    MasterViewController *masterViewController; 
    WorkerViewController *workerViewController; 
} 

@property(nonatomic, retain) IBOutlet UIWindow *window; 
@property(nonatomic, retain) IBOutlet MainScreenViewController *mainScreenViewController; 
@property(nonatomic, retain) IBOutlet MasterViewController *masterViewController; 
@property(nonatomic, retain) IBOutlet WorkerViewController *workerViewController; 

-(void)changeToMaster; 
-(void)changeToWorker; 

@end 

ErwinAppDelegate.m

@implementation ErwinAppDelegate 

@synthesize window, mainScreenViewController, masterViewController, workerViewController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after application launch 
    [window addSubview:mainScreenViewController.view]; 
    [window addSubview:masterViewController.view]; 
    [window addSubview:workerViewController.view]; 
    [window makeKeyAndVisible]; 

    // Bring first view up front 
    [window bringSubviewToFront:mainScreenViewController.view]; 
} 


-(void)changeToMaster { 
    NSLog(@"changeToMaster - Stage 1"); 
    [window bringSubviewToFront:masterViewController.view]; 
    NSLog(@"changeToMaster - Stage 2"); 
} 


-(void)changeToWorker { 
    NSLog(@"changeToWorker - Stage 1"); 
    [window bringSubviewToFront:workerViewController.view]; 
    NSLog(@"changeToWorker - Stage 2"); 
} 
@end 

Répondre

2

Il semble que vous essayez d'appeler une méthode de classe: +[ErwinAppDelegate changeToMaster] alors que vous l'avez déclarée comme méthode d'instance. Vous devez conserver une référence à l'objet délégué de l'application dans votre MainViewController. Actuellement, vous ne traitez que des méthodes statiques (classe). La "bonne" façon de le faire serait de créer un protocole de délégué dans MainScreenViewController, et après avoir ajouté cette vue à votre fenêtre dans ErwinAppDelegate, réglez mainScreenViewController.delegate = self.

Voici quelques informations très utiles sur la création et l'utilisation de délégués: How do I create delegates in Objective-C?

+0

Je suis désolé, vous avez tout expliqué très bien et tout a un sens, mais j'ai une question ... de quelle vue parlez-vous quand vous dites "après avoir ajouté cette vue à votre fenêtre?" Parlez-vous après avoir ajouté la vue mainScreenViewController à la fenêtre, puis le déclarer en tant que délégué? –

+0

Ce que je voulais dire, c'est qu'après avoir exécuté '[window addSubview: mainScreenViewController.view]' vous feriez quelque chose comme 'mainScreenViewController.delegate = self'. Ensuite, dans votre instance de MainScreenViewController, vous pouvez appeler directement [self.delegate changeToWorker], etc. – pix0r

0

Juste une supposition, mais vous voulez probablement une instance de votre ErwinAppDelegate pour envoyer le message à ...

Il devrait y avoir ErwinAppDelegate eadeleg; [eadeleg changeToMaster]; non?

+0

J'ai essayé cette méthode d'approche, mais ensuite il y a un avertissement/erreur indiquant que je référence une variable d'instance (dans mon cas ce serait window) dans une méthode de classe, donc ça n'a pas marché. –

Questions connexes