2

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

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


感谢你的回复。我试着按照你的建议做,但我仍然无法让它在我想要的时候显示出来。我尝试在 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

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

在视图控制器的 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;
}

希望这可以帮助!

于 2009-05-27T10:28:12.670 回答