2011-02-25 4 views
0

mon application est basée sur la navigation. dans lequel j'ai une tableView principale qui montre les éléments de flux dans les cellules. Lorsqu'une cellule est cliquée, une vue de détail est créée qui affiche les détails de cet élément de fil. Je travaille avec des notifications push maintenant. lorsque le bouton d'action dans la notification est cliqué,iPhone: comment recharger tableView et pousser un detailView depuis AppDelegate?

(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo: 

est appelée. comment puis-je mettre en œuvre cette méthode que si le bouton d'action dans la notification est cliqué. il doit à nouveau analyser le flux, recharger la tableview, créer les derniers détails detail feed et le pousser dans la pile de navigation. J'ai essayé du code mais ça n'a pas marché. voici le code que j'ai écrit.

dans AppDelegate:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
       RootViewController *controller = [[RootViewController alloc] init]; 
       [controller newFeedItem]; 
    } 

dans RootViewController:

- (void)newFeedItem 
    { 
     spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
spinner.frame=CGRectMake(130, 170, 50, 50); 
[self.view addSubview:spinner]; 
[spinner startAnimating]; 

[self performSelector:@selector(doStuff) withObject:nil afterDelay:0.01]; 
    } 

    -(void)doStuff 
    { 

    [[self stories] removeAllObjects]; 
    [self startParsing]; 
    [self.tableView reloadData]; 
// create detailview and push it in navigational stack 
     [spinner stopAnimating]; 
    [spinner release]; 
} 

mais indicateur d'activité n'apparaît pas et tableView est pas non plus rechargeait. Pourquoi cela se passe-t-il ainsi? Thanx à l'avance

Répondre

1

Vous n'êtes pas sûr de votre flux de programme, mais je suppose que vous affichez le rootViewController au démarrage du programme et que vous recevez une notification à distance par la suite.

Dans votre code (dans didReceiveRemoteNotification) vous instanciez un nouveau rootViewController et celui-ci sera différent de celui qui est déjà à l'écran. Suite à votre approche, vous voudrez peut-être allouer le contrôleur une fois et le garder pour plus tard lorsque la notification à distance arrive.

Personnellement, je suggère d'utiliser les notifications locales et de déclencher une notification locale dans didReceiveRemoteNotification et de l'attraper dans le rootViewController. Cela garantirait que l'instance actuellement active du contrôleur répond.

Également ne sais pas pourquoi le fileur ne montre pas, pour un essai l'appel du viewDidAppear, juste il le voit cela fonctionne du tout et si le problème est avec la réaction à la notification à distance. Et utilisez des points d'arrêt.


Modifier par rapport à votre commentaire:

dans l'interface définissent

RootViewController *controller

dans la mise en œuvre vous alloc le contrôleur (par exemple dans appDidFininshLaunching)

if (controller == nil) controller = [[RootViewController alloc] init] 

en didReceiveRemoteNotification vous pouvez alors faire

  [controller newFeedItem]; 

sans l'allouer à nouveau et vous pouvez vous référer au même contrôleur. N'oubliez pas de le libérer dans -(void)dealloc

+0

bien si je n'instancie pas un nouveau rootViewController, comment j'analyse à nouveau le flux. tout l'analyse se passe dans rootViewController. Est-il possible d'écrire du code dans didReceiveRemoteNotification qui va accéder au rootViewController celui que j'ai déjà? – Piscean

+0

yup je montre le rootViewController au démarrage du programme et à un moment ultérieur je reçois la notification à distance. et je veux que la tableView soit rechargée quand le bouton d'action dans la notification est cliqué. – Piscean

+0

s'il vous plaît voir les modifications à ma réponse sur la façon de réutiliser le contrôleur – Olaf

Questions connexes