ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

UIProgressView

Часто бывает такая ситуация, когда наша программа выполняет какуюто операцию на протяжении длительного времени. Это может быть загрузка игры, скачивание данных с интернета, архивирование файлов или конвертация файлов. Чтобы пользователю не показалось, что программа не работает не плохо было бы как-то отображать на каком этапе сейчас операция. Для таких целей и существует UIProgressView. В этом примере я покажу как правильно рабоать с этим элементом интерфейса.

 

Для начала создадим новый проект на основе представления (View-based Application) и назовем его MyProgress. Изменим класс MyProgressViewController в только что созданном проекте:

 

MyProgressViewController.h

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface MyProgressViewController : UIViewController {
    UIProgressView *myProgress;
    NSTimer *myTimer;
}

@property (nonatomic, retain) IBOutlet UIProgressView *myProgress;
@property (nonatomic, retain) NSTimer *myTimer;

@end</code>

 

Кроме самого прогресса я добавли таймер (о нем я уже писал здесь). Дело в том, что я не буду нагружать приложение каким-то процессом. Я просто буду изменять значение прогресса в промежутках времени.

 

MyProgressViewController.m

<code data-result="[object Object]">#import "MyProgressViewController.h"

@implementation MyProgressViewController

@synthesize myProgress;
@synthesize myTimer;

- (void)dealloc {
    self.myProgress = nil;

    if ([myTimer isValid]) {
        [myTimer invalidate];
    }
    self.myTimer = nil;

    [super dealloc];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.myProgress = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    myProgress.progress = 0.0f;
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f 
                                                    target:self 
                                                  selector:@selector(changProgress) 
                                                  userInfo:nil 
                                                   repeats:YES];
}

- (void)changProgress {
    myProgress.progress = myProgress.progress + 0.1f;

    if (myProgress.progress == 1.0f) {
        [myTimer invalidate];
    }
}

@end</code>

 

Здесь мы синтезируем методы доступа для таймера и прогресса, а так же организовываем корректную очистку памяти для них. В методе viewDidLoad создаем таймер, как это уже было описано в уроке работы с таймером. Наш таймер с периодичностью в одну секунду будет вызвать метод changProgress, который в свою очередь увеличивает значение прогресса на 0.1.

 

Осталось связать переменную myProgress с аналогичным объектом интерфейса, как мы это делали с UISlider. Только теперь с библиотеки объект будем выбирать не Slider, а Progress View и ни с каким методом его связывать не будем.

 

Следует обратить внимание на свойства Progress View. Он имеет два стиля (UIProgressViewStyleDefault и UIProgressViewStyleBar) их можно изменить в интерфейсе. Кноме этого, максимальное значение этого элемента — 1, а минимальное — 0. То есть, задавать прогресс следует в процентах, где 100 процентов будет еденица.

 

Исходный код этого проекта можно скачать здесь.