2009-05-21 20 views
2

アプリケーションが1つのビューコントローラにあるときに、別のビューコントローラを開くためにタブバーコントローラをクリックしたときにデータが読み込まれるようにシミュレートするビューを追加します。 例:アプリケーションがレコーダービューにあるとき、録画ファイルのリストに変更すると、読み込みビュー(アクティビティインジケーターが表示されたビュー)が表示されます(ロードに時間がかかることがあります)。私はviewWillDisappearイベントでこれを操作しようとしましたが、動作させることができません - viewDidAppearイベントが発生した後にビューが追加されていません。iPhone - ローディングビューを作成する

誰もがこれに関する考えを持っていますか? おかげ


は、ご返信いただきありがとうございます。私はtouのようにやってみましたが、私が望む時にはそれを見せてもらえません。私はviewWillDisappearイベントでhidden = NOを設定しようとしましたが、View Controllerが消えて次のビューアーが表示される前に表示されません。

+0

これは役に立つブログ記事です。 http://suavesnippets.blogspot.com/2011/06/animation-effect-on-your-splashwelcome.html – Appster

答えて

2

今は画面全体を占めるU​​ITabBarControllerがあるようです。私が行うことは、TabBarControllerの上にローディングビューを置き、必要でないときに非表示にすることです。私はあなたのタブバーコントローラから(またはあなたが望むならprogramatically)同じxibにloadingViewControllerのサブクラスを作成し、それをApp Delegateの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

詳細な返信いただきありがとうございます。これはエレガントなソリューションのように見えますが、週末にこのコードを試してみましょう=) –

関連する問題