iPhone - 创建加载视图

时间:2009-05-21 08:30:57

标签: iphone uiview uiviewcontroller uitabbarcontroller

当应用程序位于一个视图控制器中时,我想添加一个视图来模拟当我单击我的标签栏控制器以打开另一个视图控制器时正在加载数据。 示例:当我在应用程序位于记录器视图中时,我希望它在显示已记录文件列表(可能需要一些时间加载)时显示加载视图(带有活动指示符的视图)。我试过用viewWillDisappear-event来操作它,但是我无法使它工作 - 在viewDidAppear-event发生之前没有添加视图。

有人对此有任何想法吗? 感谢


感谢您的回复。我尝试过像tou建议做的那样,但是当我想要时我仍然无法显示它。我尝试在viewWillDisappear事件中设置hidden = NO,但在视图控制器消失并显示下一个之前它没有显示

2 个答案:

答案 0 :(得分:2)

现在听起来你有一个占据整个屏幕的UITabBarController。我要做的是将加载视图放在TabBarController上方,并在不需要时隐藏它。我会在你的标签栏控制器来自相同的xib中创建一个loadViewController的子类(或者如果你愿意的话,以编程方式创建)并将其设置为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 :(得分:1)

我过去做过这种方式的方法是拥有一个内容视图,其中包含活动视图或适当的视图。

在视图控制器的nib中,不是将子视图添加到主视图,而是将其保留为空并为视图创建一个新视图(例如下面示例中的表视图)。

同时创建一个活动视图(带有线程进度指示器或某些)和“无结果”视图。

然后从以下内容派生您的控制器类:

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

希望这有帮助!