2010-05-06 5 views
1

J'essaie d'ajouter un «loader-view» à mon application qui montre un fileur tout en faisant des choses.iPhone chargement vue de nib fonctionne seulement une fois

Cela fonctionne bien la première fois, mais cela ne fonctionne pas une deuxième fois.

voici ce que je fais:

J'ai un viewController pour la fileuse (spinnerViewController) et un fichier nib que je fait dans IB (spinner.xib).

je charge la pointe dans le viewDidLoad événement:

spinnerView = [[spinnerViewController alloc] initWithNibName:@"spinner" bundle:nil]; 

[spinnerView retain];

spinnerView est déclarée dans le .h fichier (spinnerViewController * spinnerView;)

suivante, je montre la fileuse vue:

[self.view addSubview:spinnerView.view]; 
[self.view bringSubviewToFront:spinnerView.view]; 

qui fonctionne très bien ...

Et maintenant le problème commence. Peu importe ce que je fais, je ne peux pas montrer la vue de spinner à nouveau.

J'ai essayé juste de le cacher (self.view sendSubViewToBack: spinnerView.view) qui fonctionne pour cacher, mais quand j'essaie de le mettre à l'avant à nouveau (self.view bringSubViewToFront: spinnerView.view) cela ne fonctionne pas .

J'ai essayé aussi enlever la fileuse vue et l'ajouter à nouveau sans succès (dans le spinnerViewController: [self.view removeFromSuperview] et de le montrer à nouveau [... self.view addSubview)

[EDIT ]

J'ai changé un peu l'ensemble de l'installation et je viens juste de faire en sorte que le spinner-view soit une sous-vue dans IB - encore une fois, le masquage fonctionne, mais l'affichage échoue à nouveau. Ce que j'ai découvert: Après la commande bringSubViewToFront, j'appelle un service web pour obtenir des données. Quand je commente le code suivant et montre juste le spinnerView, cela fonctionne. Alors maintenant j'essaie de comprendre comment déterminer quand la vue de spinner est apparue et ensuite continuer avec le code - mais naturellement, cela ne fonctionne pas (encore) :)

Toutes les idées que je fais mal ??? ;)

Répondre

1

Problème résolu.

Cette page a donné la réponse: http://urenjoy.blogspot.com/2009/05/uiactivityindicatorview.html

Apparemment, la mise à jour doit se produire dans un thread séparé, comme les blocs-stuff web l'actuel, d'où la vue ne semble pas.

[NSThread detachNewThreadSelector:@selector(doWork) toTarget:self withObject:nil]; 
- (void) doWork { 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

.....Time Consuming Code here ..... 

[pool release]; 

} 
0

je pourrais être pas exactement sur votre question, mais en général la création d'une classe ViewController afin de montrer une fileuse à l'écran est un énorme surpuissant ... essaie juste de découvrir la logique derrière ce que vous faites: vous créez un viewcontroller, mais vous ne l'utilisez jamais, vous utilisez la vue.

Donc, en bref, je crois que vous avez seulement besoin d'un UIView (la propriété vue de la UIViewController) Pourquoi ne pas essayer quelque chose comme:

... in your class interface... 

UIActivityIndicator* activity; 

... when the activity needs to happen ... 

activity = [[UIActivityIndicator alloc] initWithActivityIndicatorStyle: .... 
[activity startAnimating]; 
[self.view addSubview:activity]; 
[activity release] 

... when the activity is finished 

[activity removeFromSuperview]; //this will also decrease the retain count 
+0

Salut Ican Oui - vous avez raison, ce était une exagération et je me suis rendu compte qu'après avoir posé la question. Je crée toujours le spinner dans IB, cependant, comme je trouve cela très pratique. Mais le ViewController est parti maintenant et je charge juste la plume et l'affiche. Merci quand même pour l'indice, bien que - j'essaie toujours de me concentrer sur Objective-C et le SDK ... Donc tout est utile :) –

Questions connexes