【问题标题】:iPhone - creating a loading viewiPhone - 创建加载视图
【发布时间】:2010-10-27 20:58:18
【问题描述】:

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

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


感谢您的回复。我试着按照你的建议做,但我仍然无法让它在我想要的时候显示出来。我尝试在 viewWillDisappear-event 中设置 hidden = NO,但在该视图控制器消失并且下一个出现之前它没有显示

【问题讨论】:

标签: iphone uiview uiviewcontroller uitabbarcontroller


【解决方案1】:

现在听起来你有一个占据整个屏幕的 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;
}

【讨论】:

    【解决方案2】:

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

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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的详细回复!这看起来是一个优雅的解决方案,我会在周末尝试这段代码 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多