Добавление визуального таймера в представление, iPhone - PullRequest
0 голосов
/ 06 декабря 2009

У меня есть вид (заставка), который отображается в течение двух минут:

- (void)applicationDidFinishLaunching:(UIApplication *)application

{

[viewController showSplash];

}

- (void)showSplash // Show splash screen
{
 UIViewController *modalViewController = [[UIViewController alloc] init];
 modalViewController.view = modelView;
 [self presentModalViewController:modalViewController animated:NO];
 [self performSelector:@selector(hideSplash) withObject:nil afterDelay:120.0]; 
}

Я хочу добавить таймер, который ведет обратный отсчет от 2 минут до нуля на этом заставке.

Я предполагаю, что мне нужно будет создать другое представление, содержащее таймер. Это правильно? Как мне сделать это и добавить его на заставку, и как сделать так, чтобы числа в таймере отображались на экране белым цветом?

Я знаю, что две минуты - это очень много времени для отображения заставки ... но я просто экспериментирую с разными вещами, в течение двух минут происходят другие вещи!

Большое спасибо,

Stu

Редактировать // Хорошо, теперь у меня есть это:

(. Ч)

NSTimer *timer5;
    UILabel *countDown;
    float timeOnSplash;

(м.)

- (void) updateLabel:(NSTimer*)theTimer 
{
    float timeOnSplash = timeOnSplash - 1;
    countDown.text = [NSString stringWithFormat:@"%02d:%02d", timeOnSplash];
}


- (void)applicationDidFinishLaunching:(UIApplication *)application

{

    timer5 = [NSTimer scheduledTimerWithTimeInterval:1

        target:self
        selector:@selector(updateLabel:) 
        userInfo:nil
        repeats:YES];

    countDown.text = [NSString stringWithFormat:@"%02d:%02d", timeOnSplash];
}

При выполнении кода я получаю следующее необработанное исключение:

'NSUnknownKeyException', причина: '[setValue: forUndefinedKey:]: этот класс не совместим со значением ключа для кодирования ключа countDown.'

Есть идеи?

Редактировать 2 // Работая сейчас, для отличного решения см. Ответ TechZen.

Большое спасибо всем!

Ответы [ 4 ]

3 голосов
/ 06 декабря 2009

NSTimers являются необычными объектами в том смысле, что они не привязываются к объекту, который их создает, а к экземплярам NSRunLoop приложений. Если таймер один выстрел, вам не нужно сохранять какие-либо ссылки на него. Вы должны запустить таймер и забыть об этом.

В вашем случае вам нужно два трека с двумя временными интервалами (1) прохождение каждой секунды, чтобы вы могли обновить интерфейс и (2) прохождение общего двухминутного интервала.

Для (1) вы должны вызвать повторяющийся таймер с интервалом в одну секунду, который вызывает метод в modalviewcontroller, который обновляет интерфейс. Лучшее место для вызова таймера - метод viewDidAppear контроллера. Для (2) у вас может быть свойство контроллера, которое хранит значение 159, а затем метод, вызываемый таймером, уменьшает его при каждом вызове метода. Когда он достигает нуля, он делает недействительным таймер.

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

Мне действительно интересно, зачем вам нужно показывать заставку ровно две минуты.


Кроме того, в Руководстве по интерфейсу пользователя iPhone прямо говорится, что вы не должны использовать заставки. Они могут привести к отклонению вашего приложения. Использование заставки, которая висит долго, создает впечатление, что приложение или телефон вышли из строя, и Apple это тоже не нравится.

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

Еще лучше, потому что никто в движении не хочет смотреть статичное приложение для iPhone в течение двух минут, лучше, чтобы ваш пользователь начал делать что-то в одном потоке, а приложение настраивается в другом. Например, в каком-либо URL-соединении вы могли бы начать вводить пользовательские данные и адреса некоторых данных, пока приложение устанавливает соединение. Для игры вы можете попросить пользователя выбрать свое имя, просмотреть рекорды, просмотреть инструкции и т. Д.

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

Обычно я бы предостерегал от преждевременной оптимизации, но это довольно важно.

Edit01:

Вы хотите что-то подобное в вашем контроллере заставки.

@interface SplashScreenViewController : UIViewController {
    NSInteger countDown;
    IBOutlet UILabel *displayTimeLabel;
}
@property NSInteger countDown;
@property(nonatomic, retain)   UILabel *displayTimeLabel;
@end

#import "SplashScreenViewController.h"

@implementation SplashScreenViewController
@synthesize countDown;
@synthesize displayTimeLabel;

-(void) viewDidAppear:(BOOL)animated{
    countDown=120;
    NSTimer *secTimer=[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountDown:) userInfo:nil repeats:YES];
}//------------------------------------viewDidAppear:------------------------------------


-(void) updateCountDown:(NSTimer *) theTimer{
    NSInteger mins,secs;
    NSString *timeString;
    countDown--;
    if (countDown>=0) {
        mins=countDown/60;
        secs=countDown%60;
        displayTimeLabel.text=[NSString stringWithFormat:@"%02d:%02d",mins,secs];

    } else {
        [theTimer invalidate];
        // do whatever you wanted to do after two minutes
    }

}//-------------------------------------(void) updateCountDown------------------------------------
@end
-------
0 голосов
/ 06 декабря 2009

Вы можете использовать NSTimer, как предложено @Morion. Альтернативой является следующее:

В вашем файле @interface добавьте переменную:

NSInteger   countDown;

затем в @implementation:

- (void)showSplash // Show splash screen
{
    UIViewController *modalViewController = [[UIViewController alloc] init];
    modalViewController.view = modelView;
    [self presentModalViewController:modalViewController animated:NO];
    countdown = 120;
    [self performSelector:@selector(updateTime) withObject:nil afterDelay:1.0];
}


- (void)updateTime {
    //decrement countDown
    if(--countDown > 0){
        //
        // change the text in your UILabel or wherever...
        //
        //set up another one-second delayed invocation
        [self performSelector:@selector(updateTime) withObject:nil afterDelay:1.0];

    }else{
        // finished
        [self hideSplash];
    }
}
0 голосов
/ 06 декабря 2009

Да, одним из способов было бы создание нового представления с прозрачным фоном ([UIColor clearColor]) и надписью с белым текстом. Просто позвоните [modalViewController.view addSubview:timerView], чтобы добавить его как подпредставление / оверлей.

Я не уверен, какая помощь вам понадобится для создания видов, установки меток и т. Д.

0 голосов
/ 06 декабря 2009

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

...