2010-11-30 4 views
1

Ceci est très étrange. Ma vue reçoit une notification avec un numéro d'index que j'utilise pour trouver un bouton d'interface utilisateur par étiquette, puis modifier son étiquette de texte. Le seul problème est que le texte ne changera pas. J'ai mis des points de rupture et le code est en cours d'exécution.bizarrement une étiquette de texte uibuttons ne changera pas

Existe-t-il des particularités avec des étendues variables lors de l'utilisation de notifications?

- (void)receiveEvent:(NSNotification *)notification { 


    int pass = [[[notification userInfo] valueForKey:@"index"] intValue]; 
    NSLog(@"button index is %i", pass); 

    UIButton *changebut = (UIButton *) [self.view viewWithTag:pass]; 
    ButtonStatusModel *m= [self.buttoneventpendingarray objectAtIndex:pass]; 
    NSLog(@"current but status = %i",m.btnstatus); 
    if (m.btnstatus==3) { 
     //this should change the label but it does not; 
     [changebut setTitle:@"playing" forState:UIControlStateNormal]; 
     m.btnstatus=2; 
     NSLog(@"should set text to 'playing"); 
     //[engine addActionToQue:buttonid actionSample:actionsample action:1]; 

    }else if (m.btnstatus==1) { 

     //this should change the label but it does not; 
     [changebut setTitle:@"idle" forState:UIControlStateNormal]; 
     NSLog(@"should set text to 'idle"); 
     m.btnstatus=0; 
     //[engine addActionToQue:buttonid actionSample:actionsample action:0]; 

    } 


} 

EDIT 1 Merci à commenters j'ai déterminé que même si ma fonction reciveevent dans mon principal contrôleur de vue la fonction est en cours d'exécution du thread principal (ne comprends pas vraiment ce) et donc ce pourquoi l'étiquette du bouton ne changera pas.

J'ai utilisé le code suivant pour déterminer s'il s'agissait du thread principal ou non. Je pense maintenant à changer l'étiquette de bouton que je dois appeler effectuer sélecteur sur le fil principal? Est-ce la bonne chose à faire? Si oui, j'ai besoin de passer une fonction 2 variables, je ne vois pas comment effectuer sélecteur sur le thread principal accueille cela.

-(void) updatebutton:(int)tag changeto:(int) val 
{ 

    if ([NSThread isMainThread]) { 
     { 
      NSLog(@"is main thread"); 
     } 
    } else { 
     NSLog(@"is not thread"); 
     [self performSelectorOnMainThread:@selector(/*function with 2 parameters here*/) withObject:nil waitUntilDone:YES]; 

    } 

} 

EDIT 3 *

L'utilisation de blocs au lieu de sélecteur principal m'a aidé à sortir de mon problème. Je ne comprends pas vraiment tout le fil principal cependant. J'ai supposé que si le code était dans mon contrôleur de vue que n'importe quel code exécuté serait exécuté sur le fil principal. Cela semble être gros gros mal. J'apprécierais un peu d'éclaircissement à ce sujet.

Heres ce que je de toute façon

-(void) updatebutton:(int)tag changeto:(int) val 
{ 
    UIButton *changebut = (UIButton *) [self.view viewWithTag:tag]; 

    if ([NSThread isMainThread]) { 
     { 
      NSLog(@"is main thread"); 

      if (val==2) { 
       [changebut setTitle:@"playing" forState:UIControlStateNormal]; 

      } 

      if (val==0) { 

        [changebut setTitle:@"idle" forState:UIControlStateNormal]; 
      } 

     } 
    } else { 
     NSLog(@"is not thread"); 
     //[self performSelectorOnMainThread:@selector(updatebutton::) withObject:nil waitUntilDone:YES]; 

     if (val==2) { 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [changebut setTitle:@"playing" forState:UIControlStateNormal]; 
      }); 
     } 

     if (val==0) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [changebut setTitle:@"idle" forState:UIControlStateNormal]; 
      }); 
     } 

    } 

} 
+2

Avez-vous vérifié si 'changebut' est' nil' (après l'avoir lancé)? Est-ce que '-receiveEvent' est appelé par un autre que le thread principal? Les modifications de l'interface utilisateur doivent être effectuées sur le thread principal. –

+0

changebut n'est "pas" nul après l'avoir coulé. La fonction recieveevent vit dans ma vue principale. La notification n'est pas générée à partir d'une vue – dubbeat

+0

Y at-il un moyen de vérifier le contexte est le thread principal? – dubbeat

Répondre

0

Est-ce que -receiveEvent est appelé sur un autre que le thread principal? Les modifications de l'interface utilisateur doivent être effectuées sur le thread principal.

2

Essayez de mettre

[changebut setTitle:@"idle" forState:UIControlStateNormal]; 

dans la méthode -viewDidAppear. Si cela ne fonctionne pas non plus, assurez-vous que toutes les prises sont connectées dans IB. De plus, essayez d'ajouter quelques espaces comme titre du bouton dans votre fichier .xib (si vous en avez un).

+0

Je n'utilise aucun xib – dubbeat

+0

Ok. Avez-vous essayé de changer le titre dans -viewDidAppear? Ça a marché? – Knodel

+0

J'ai eu un problème similaire et l'ajout de 'viewDidAppear' fonctionne, mais le mettre dans' viewDidLoad' n'a eu aucun effet. Une idée de pourquoi ça ne marche pas dans 'viewDidLoad' ?? Il exécutait définitivement la ligne, mais cela n'avait aucun effet. – devios1

Questions connexes