2009-05-21 5 views
2

Когда приложение находится в одном контроллере представления, я хочу добавить представление для имитации того, что данные загружаются, когда я нажимаю на контроллер панели вкладок, чтобы открыть другой контроллер представления. Пример: Когда приложение находится в режиме рекордера, я хочу, чтобы он отображал загрузочный вид (представление с индикатором активности), когда я перехожу к списку записанных файлов (что может занять некоторое время для загрузки). Я попытался манипулировать этим с viewWillDisappear-событием, но я не могу заставить его работать - представление не добавляется до появления события viewDidAppear.iPhone - создание вида загрузки

У кого-нибудь есть мысли по этому поводу? СООБЩЕНИЕ


Благодарим вас за ответ. Я пробовал делать то, что предложил, но я все еще не могу заставить его показать, когда захочу. Я пытаюсь установить hidden = NO в моем представленииWillDisappear-event, но он не отображается до того, как этот контроллер просмотра исчезнет, ​​и появится следующий

+0

Это сообщение в блоге! http://suavesnippets.blogspot.com/2011/06/animation-effect-on-your-splashwelcome.html – Appster

ответ

2

Прямо сейчас, похоже, что у вас есть UITabBarController, который занимает весь экран. То, что я сделал бы, - это поставить надпись над TabBarController и скрыть ее, когда это не необходимо. Я бы создал подкласс loadViewController в том же xib, на котором был выведен контроллер панели вкладок (или программно, если хотите) и установите его в IBOutlet делегата приложения.

Что-то вроде этого:

//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

Как я уже делал это в прошлом, чтобы иметь представление содержимого в котором находится либо вид деятельности или вид правильной.

В представлении контроллера контроллера вместо добавления subviews в основное представление оставьте его пустым и создайте новое представление (например, представление таблицы в примере ниже) для представления.

Также создайте вид деятельности (с индикатором прогресса резьбы или сопутствующим) и представлением «нет результатов».

Затем вывести свой класс контроллера с чем-то вроде следующего:

// 
// 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 

И в методе -viewDidLoad производного класса, оттенить (асинхронный) запрос:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

и в обратном вызове делегата:

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

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

Надеюсь, это поможет!

+0

Благодарим вас за подробный ответ! это выглядит как элегантное решение, я попробую этот код за выходные =) –

Смежные вопросы