iPhone - создание представления загрузки - PullRequest
2 голосов
/ 21 мая 2009

Когда приложение находится в одном контроллере представления, я хочу добавить представление для имитации загрузки данных, когда нажимаю на контроллер панели вкладок, чтобы открыть другой контроллер представления. Пример. Когда приложение находится в режиме записи, я хочу, чтобы оно отображало представление загрузки (представление с индикатором активности), когда я переключаюсь на список записанных файлов (загрузка которого может занять некоторое время). Я пытался манипулировать этим с помощью события viewWillDisappear, но я не могу заставить его работать - представление не добавляется до того, как происходит событие viewDidAppear.

У кого-нибудь есть мысли по этому поводу? Спасибо


Спасибо за ваш ответ. Я пытался делать то, что предложил ту, но я все еще не могу показать, когда захочу. Я пытаюсь установить скрытое = НЕТ в моем viewWillDisappear-событии, но оно не отображается, пока этот контроллер представления не исчезнет и появится следующий

Ответы [ 2 ]

2 голосов
/ 21 мая 2009

Прямо сейчас это звучит так, как будто у вас есть UITabBarController, который занимает весь экран. То, что я хотел бы сделать, это поместить представление загрузки над TabBarController и скрыть его, когда в этом нет необходимости. Я бы создал подкласс loadingViewController в той же самой xib, из которой пришел ваш контроллер панели вкладок (или программно, если хотите), и установил бы его в 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 голос
/ 27 мая 2009

То, как я делал это в прошлом, - это представление содержимого, в котором размещается либо представление активности, либо собственно представление.

В кончике контроллера представления вместо добавления подпредставлений к основному представлению оставьте его пустым и создайте новое представление (например, представление таблицы в примере ниже) для собственно представления.

Также создайте представление активности (с многопоточным индикатором хода выполнения или чем-то подобным) и представление «без результатов».

Затем выведите класс вашего контроллера из следующего:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...