2009-05-21 59 views
2

當應用程序在一個視圖控制器,我想補充一個觀點來模擬數據被加載,當我點擊我的標籤欄控制器打開另一個視圖控制器。 實施例:當我的應用程序是在記錄視圖,我希望它示出了加載視圖(具有活動的指標的圖)當我改變到記錄文件的列表(其可能需要一些時間來加載)。我試着用viewWillDisappear事件來操作它,但我無法讓它工作 - 在viewDidAppear事件發生之後,視圖不會被添加。iPhone - 創建一個加載視圖

任何人有對此有什麼想法? 謝謝


謝謝你的回覆。我試着做像tou建議的,但我仍然無法在需要時顯示它。我嘗試在viewWillDisappear事件中設置hidden = NO,但是在視圖控制器消失並且下一個出現之前它不顯示。

+0

這是一個有用的博客文章! http://suavesnippets.blogspot.com/2011/06/animation-effect-on-your-splashwelcome.html – Appster 2011-06-14 14:58:09

回答

2

現在聽起來好像你有一個UITabBarController佔據了整個屏幕。我會做的是將加載視圖放在TabBarController上方,並在不需要時隱藏它。我會在你的標籤欄控制器所來自的同一個xib中創建一個loadingViewController的子類(如果你願意,也可以用編程方式),並將其設置爲應用程序委託的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

我已經在過去這樣做的方式是有其容納任何活動視圖或視圖正確的內容視圖。

在視圖控制器的筆尖,而不是添加到子視圖的主視圖,留空,併爲視圖正確新視圖(如在下面的示例的表圖)。

另外創建活動圖(具有螺紋進度指示器或諸如此類)和一個「無結果」視圖。

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

感謝您的詳細回覆!這看起來像一個優雅的解決方案,我會在週末嘗試這個代碼=) – 2009-05-30 17:51:47