2009-12-07 3 views
1

Je suis nouveau à l'obj C, je viens d'un fond AS3.0. Fondamentalement dans cette application que je fais, j'utilise le applicationWillResignActive dans le délégué de l'application pour réagir à un appel entrant. J'ai un navigationController avec une vue de table qui déclenche juste une autre vue sur select (le modèle fourni dans xcode fondamentalement) J'ai une méthode dans ma vue AnotherViewController qui est chargée à partir de la sélection de ligne. Cette méthode changera (pour l'instant) mon étiquette là-bas pour "Call coming in". Dans mon applicationWillResignActive j'appelle cette méthode et cela fonctionne très bien mais je reçois un avertissement ennuyeux disant que UIViewController peut ne pas être capable de répondre à handleIncomingCall ... mais il compile bien et répond. Comment puis-je me débarrasser de ce panneau d'avertissement?envoyer un message à viewController du délégué de l'application

-(void) applicationWillResignActive:(UIApplication *)application { 
    NSLog(@"CALL COMIN IN"); 
    UIViewController *vc = [navigationController visibleViewController]; 
    [vc handleIncomingCall]; 
    [vc release]; 
} 

Désolé, je suis en train de comprendre comment formater ici ...

Répondre

0

La raison est parce que nous disons que le compilateur l'objet est de UIViewController et handleIncomingCall est en effet pas méthode de UIViewController. Vous pouvez vous débarrasser de l'avertissement, y compris le fichier .h et en définissant l'objet comme AnotherViewController ou tout ce que vous avez fini par l'appeler. Le délégué verra dans le fichier .h que handleIncomingCall est une méthode de cette classe et cessera donc de vous donner cet avertissement.

Obj-C n'est pas un langage fortement typé, c'est pourquoi il compile. Cela fonctionne parce que bien que vous définissiez la variable comme UIViewController il est en fait de votre propre type qui répond au message approprié. Mais il n'y a aucun moyen pour le compilateur de le savoir au moment de la compilation.

+0

Hey, Merci pour la réponse. C'est sur le point d'arriver. J'ai compris qu'il essayait en effet d'appeler ma méthode sur UIViewController, donc je l'ai lancé sur AnotherViewController. Le problème est que n'importe quel nombre de contrôleurs de vue peut être visible pendant cet événement, pas seulement AnotherViewController. Des suggestions sur la façon dont je pourrais écrire cela? Un moyen de vérifier quel type est actuellement visible et agir en conséquence? – bmanderscheid

0

OK, donc je fais ceci:

AnotherViewController *vc = (AnotherViewController *) navigationController.visibleViewController; 
    if ([vc isKindOfClass:[AnotherViewController class]]){ 
     [vc handleIncomingCall]; 
    } 
    else{ 
     NSLog(@"NOT ANOTHER VIEW CONTROLLER DO NOTHING"); 
    } 

Cela fonctionne très bien pour cette application, je me demande comment vous gérer s'il y avait plusieurs vues avec cette méthode et que vous vouliez appeler. Je ne pense pas que vous ajouteriez un tas de || à l'instruction if. Je traverserai ce pont quand j'arriverai là. Merci beaucoup pour l'aide !!

0
  1. Vous pouvez donner à chaque sous-classe pour vc toutes les méthodes que vous aimez et les invoquer avec la classe commune, le message sera passé sur le bas.

  2. La solution la plus rapide est la suivante: NSNotificationCenterexample. Testé et fonctionne. J'avais besoin de faire d'autres choses, donc je l'ai fait différemment.

Créez des méthodes handleVC1, handleVC2 etc dans appDelegate.

Sur viewWillAppear dans chaque viewcontroller qui doit répondre, définissez un objet visibleID (de tout type) dans appDelegate.

Dans applicationWillResignActive, utilisez l'ID pour appeler la méthode appropriée. Ils pourraient être

-(void)handleVC1 {[vc1 handleIncomingCall];} 

-(void)handleVC2 {[vc2 handleIncomingCall];} 

Mais si cette manipulation ne doit pas être fait à l'intérieur de chaque viewcontroller, handleVC1, etc handleVC2 pourrait avoir son code écrit dans le appDelegate entièrement et pourrait encore « adapter » un peu.

J'ai l'habitude de @ classer vc1 (etc) ... IBOutlet ... ajouter et se connecter dans mainwindow.xib de toute façon.De cette façon, j'ai 1 objet initialisé pour chaque contrôleur de vue, alors je peux faire ce que je veux avec eux si le besoin s'en fait sentir. Procédure standard :)

L'un d'entre eux devrait vous corriger, je pense.

0

Je l'ai accompli en faisant cela.

Dans le délégué de l'application que je fait une propriété pour le contrôleur de vue

#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface AppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 

    UIViewController *myViewController; 


} 

@property (nonatomic, assign) UIViewController *myViewController; 


@end 

Ensuite, dans le contrôleur de vue que je voulais recevoir le message que je l'ai fait. Ensuite, je peux facilement envoyer un message à viewController à partir du délégué de l'application.

S'il vous plaît laissez-moi savoir s'il y a des problèmes de succession avec cette réponse. Cela fonctionne pour moi ...

0

Je sais que c'est une vieille question mais cela semble fonctionner pour moi.

En AppDelegate.m:

#import "ViewController.h" 

- (void)applicationWillResignActive:(UIApplication *)application { 
    ViewController *viewController = (ViewController *)self.window.rootViewController; 
    [viewController test]; // Implement this in ViewController 
} 

Et puis mettre en œuvre - (vide) test; à ViewController (ne pas oublier d'ajouter à ViewController.h trop)

- (void)test 
{ 
    NSLog(@"Test Successful"); // If all goes well, this will be printed when app resigns being active 
} 

Ceci est juste un exemple simple de la façon d'envoyer des messages au contrôleur de vue, à partir de là, vous pouvez envoyer le message plus à d'autres Instances UIViewController.

Questions connexes