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
-------