2009-05-21 6 views
2

Lorsque l'application est dans un contrôleur de vue, je souhaite ajouter une vue pour simuler le chargement des données lorsque je clique sur le contrôleur de la barre d'onglets pour ouvrir un autre contrôleur de vue. Exemple: Lorsque l'application est dans la vue enregistreur, je veux qu'elle affiche une vue de chargement (une vue avec un indicateur d'activité) lorsque je passe à la liste des fichiers enregistrés (ce qui peut prendre du temps à charger). J'ai essayé de manipuler ceci avec l'événement viewWillDisappear, mais je n'arrive pas à le faire fonctionner - la vue n'est pas ajoutée avant que l'événement viewDidAppear se produise.iPhone - création d'une vue de chargement

Quelqu'un a des idées à ce sujet? Merci


Merci pour votre réponse. J'ai essayé de faire comme suggéré tou, mais je ne peux toujours pas le montrer quand je veux. J'essaie de mettre hidden = NO dans mon viewWillDisappear-event, mais cela n'apparaît pas avant que le contrôleur disparaisse et que le suivant apparaisse

+0

Ceci est un article de blog utile! http://suavesnippets.blogspot.com/2011/06/animation-effect-on-your-splashwelcome.html – Appster

Répondre

2

En ce moment, il semble que vous ayez un UITabBarController qui occupe tout l'écran. Ce que je ferais est de mettre la vue de chargement au-dessus du TabBarController et de le cacher quand ce n'est pas nécessaire. Je voudrais créer une sous-classe de loadViewController dans le même xib votre contrôleur de barre d'onglet est venu (ou par programme si vous le souhaitez) et le définir à un IBOutlet du délégué de l'App.

Quelque chose comme ceci:

//In your App Delegate 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window addSubview:tabBarController.view]; 
     loadingView.hidden = YES; 
    [window insertSubview:loadingViewController.view aboveSubview:abBarController.view]; 
     [window makeKeyAndVisible]; 
} 


//In your loading View Controller 
- (void) setLoadingViewHidden:(BOOL)hidden { 
     self.view.hidden = hidden; 
     self.activityIndicator.animating = hidden; 
} 
1

La façon dont je l'ai fait dans le passé est d'avoir une vue de contenu qui abrite soit une vue de l'activité ou la vue appropriée. Au lieu d'ajouter des sous-vues à la vue principale, laissez-la vide et créez une nouvelle vue (comme une vue de table dans l'exemple ci-dessous) pour la vue proprement dite.

Créez également une vue de l'activité (avec un indicateur de progression fileté ou quelque chose comme ça) et une vue "pas de résultats".

ensuite dériver votre classe contrôleur de quelque chose comme ce qui suit:

// 
// ContainerViewController.h 
// 

#import <UIKit/UIKit.h> 

@interface ContainerViewController : UIViewController 
{ 
    UIView *myContainerView; 

    UITableView *myTableView; 
    UIView *mySearchActivityView; 
    UIView *myZeroResultsView; 

    UIView *myCurrentlyShowingView; 
} 

@property (retain, nonatomic) IBOutlet UIView *containerView; 

@property (retain, nonatomic) IBOutlet UITableView *tableView; 
@property (retain, nonatomic) IBOutlet UIView *searchActivityView; 
@property (retain, nonatomic) IBOutlet UIView *zeroResultsView; 

@property (assign) UIView *currentlyShowingView; 

@end 

// 
// ContainerViewController.m 
// 

#import "ContainerViewController.h" 

@implementation ContainerViewController 

@synthesize containerView = myContainerView; 

@synthesize tableView = myTableView; 
@synthesize searchActivityView = mySearchActivityView; 
@synthesize zeroResultsView = myZeroResultsView; 

- (void)dealloc 
{ 
    [myContainerView release], myContainerView = nil; 
    [myTableView release], myTableView = nil; 
    [mySearchActivityView release], mySearchActivityView = nil; 
    [myZeroResultsView release], myZeroResultsView = nil; 

    myCurrentlyShowingView = nil; 

    [super dealloc]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.currentlyShowingView = mySearchActivityView; 
    mySearchActivityView.backgroundColor = [UIColor clearColor]; 
    myZeroResultsView.backgroundColor = [UIColor clearColor]; 
} 

- (void)setCurrentlyShowingView:(UIView *)view 
{ 
    [myCurrentlyShowingView removeFromSuperview]; 
    CGRect frame = view.frame; 
    frame.size = myContainerView.frame.size; 
    view.frame = frame; 
    [myContainerView addSubview:view]; 
    myCurrentlyShowingView = view; 
    if (view == myTableView) 
     [myTableView reloadData]; 
} 

- (UIView *)currentlyShowingView 
{ 
    return myCurrentlyShowingView; 
} 

@end 

Et dans la méthode -viewDidLoad de la classe dérivée, a déclenché la (asynchrone) requête:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    myQueryLoader = [[QueryLoader alloc] initWithQuery:@"whatever" delegate:self]; 
    self.currentlyShowingView = mySearchActivityView; 
} 

et dans le rappel de délégué:

- (void)queryLoader:(QueryLoader *)queryLoader didEndWithResults:(id)results error:(NSError *)error 
{ 
    myItems = [results retain]; 

    if (myItems) 
     self.currentlyShowingView = myTableView; 
    else 
     self.currentlyShowingView = myZeroResultsView; 
} 

Espérons que cela aide!

+0

Merci pour une réponse détaillée! cela ressemble à une solution élégante, je vais essayer ce code au cours du week-end =) –

Questions connexes