2009-05-21 98 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