2

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

これに関して何か考えがある人はいますか?ありがとう


お返事ありがとうございます。私は tou が提案したようにやってみましたが、それでも私が望むときにそれを表示することはできません. viewWillDisappear-event で hidden = NO を設定しようとしましたが、そのビュー コントローラーが消えて次のビュー コントローラーが表示される前に表示されません。

4

2 に答える 2

2

現在、画面全体を占める UITabBarController があるようです。私がすることは、ローディング ビューを TabBarController の上に置き、不要な場合は非表示にすることです。タブ バー コントローラーの元 (または必要に応じてプログラムで) と同じ 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;
}
于 2009-05-21T08:54:33.883 に答える
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;
}

お役に立てれば!

于 2009-05-27T10:28:12.670 に答える