2010-04-21 11 views
1

J'ai un problème étrange avec un UIView:Iphone - UIView pas affiché

Je veux montrer un indicateur d'activité Voir que j'ai créé avec Interface Builder pour indiquer longue activité en cours d'exécution.

Dans la fonction viewDidLoad de ma principale viewController j'initialiser le ActivityIndicator Voir comme ceci:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];   
    load = [[ActivityIndicatorViewController alloc] init]; 
    ... 

Quand je pousse un bouton, il appelle cette IBAction:

- (IBAction)LaunchButtonPressed{    
    // Show the Activity indicator view. 
    [self.view addSubview:load.view]; 

    // eavy work 
    [self StartWorking];  

    // Hide the loading view. 
    [load.view removeFromSuperview];  
} 

Dans la fonction StartWorking, je poser une requête à un serveur internet et analyser le fichier XML qu'il me renvoie.

Le problème est que si j'appelle ma fonction StartWorking, l'application ne démarre pas en affichant la vue Indicateur d'activité mais avec la fonction StartWorking. Alors que si je supprime l'appel à la fonction StartWorking, la vue est affichée.

Est-ce que quelqu'un est capable de m'expliquer pourquoi? : s

+0

Si la vue est affichée après un certain délai ou si la vue n'est pas affichée du tout? – Warrior

+0

La vue est affichée avec un certain retard. –

Répondre

2

Avez-vous essayé d'appeler la méthode StartWorking sur un thread différent?
Peut-être que son processus lourd empêche d'autres instructions d'avoir lieu.

Regardez la classe NSThread, en particulier la méthode detachNewThreadSelector: toTarget: withObject:.

EDIT: A propos du problème de la piscine, vous devez créer une piscine dans votre méthode StartWorking, si elle est appelée sur un thread différent:

- (void)StartWorking 
{ 
    NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ]; 

    /* Code here... */ 

    [ pool release ]; 
} 
+0

Cela fonctionne bien, mais tous mes autorelease objet fuient parce qu'il n'y a pas de piscine en place. : s –

+0

Vous devriez être prudent en faisant des choses (fonction lourde) dans les discussions. Je préfère habituellement implémenter la fonction légère dans le fil et laisser le lourd dans le fil principal. – Francescu

1

Remplacer: [self.view addSubview:load.view];

Avec: Pour créer la méthode: -(void)addLoadingSubview{[self.view addSubview:load.view];}

+0

J'ai essayé mais le résultat est le même. J'ai utilisé: [self performSelector: @selector (ShowActivityIndicatorView) avecObject: nil afterDelay: 0.1f]; –

0

Ok, j'ai trouvé une solution basée sur la réponse santoni:

- (IBAction)LaunchButtonPressed{    
    // Show the Activity indicator view. 
    [self performSelector:@selector(ShowActivityIndicatorView) withObject:nil afterDelay:0]; 

    // eavy work 
    [self performSelector:@selector(StartWorking) withObject:nil afterDelay:2]; 

    // Hide the loading view. 
    [load.view removeFromSuperview];  
} 

La vue est l'indicateur d'activité dislayed avant l'appel à la fonction eavy.

Merci d'avoir répondu.