Как остановить NSTimer
Эй, я просто делаю пример приложения, и у меня небольшие проблемы. Поэтому у меня есть табличное представление, а затем у меня есть несколько строк, и когда пользователь нажимает на строку, она выводит их на новый вид. В этом представлении у меня есть кнопка для воспроизведения музыки. Я использую таймер, чтобы увеличить ползунок в зависимости от продолжительности музыки и оставшегося времени.
Теперь моя проблема в том, что мне нужно сделать так, что когда я вернусь к представлению таблицы через верхнюю левую кнопку, остановка NSTimer?
Это то, что у меня есть до сих пор, я не могу получить повторение: таймер YES для остановки.
#import "SecondViewController.h"
@implementation SecondViewController
@synthesize lbl1;
@synthesize timer;
-(IBAction) slide {
myMusic.currentTime = slider.value;
}
-(IBAction)play
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
slider.maximumValue = [myMusic duration];
myMusic.volume = 0.2;
[myMusic prepareToPlay];
[myMusic play];
}
-(IBAction)pause
{
[myMusic pause];
}
-(IBAction)stop
{
slider.value = 0;
myMusic.currentTime = 0;
[myMusic stop];
}
- (void)updateTime{
slider.value = myMusic.currentTime;
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
//This plays music, we must give it a path to find the file and then u can change it.
NSString * pathToMusicFile = [[NSBundle mainBundle] pathForResource:@"Katy" ofType:@"mp3"];
myMusic = [[ AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile] error:NULL];
myMusic.delegate = self;
myMusic.numberOfLoops = -1;
slider.value = 0;
//[myMusic play];
[super viewDidLoad];
}
- (void)viewDidUnload {
[timer invalidate];
timer = nil;
//myMusic.currentTime = 0;
[myMusic stop];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
-(IBAction) TxtChange;{
lbl1.text = @" test2! I CHNAGED TEXT FROM ANOTHER XIB";
}
- (void)dealloc {
[timer invalidate];
timer = nil;
[myMusic release];
[super dealloc];
}
@end
Ответы
Ответ 1
Используйте приведенный ниже код. Это будет работать
Но имейте в виду, что его нужно вызывать только в том случае, если наш таймер находится в режиме работы, иначе приложение будет разбито.
- (void)viewWillDisappear:(BOOL)animated {
//BEFORE DOING SO CHECK THAT TIMER MUST NOT BE ALREADY INVALIDATED
//Always nil your timer after invalidating so that
//it does not cause crash due to duplicate invalidate
if(timer)
{
[timer invalidate];
timer = nil;
}
[super viewWillDisappear:animated];
}
Ответ 2
вот так:
[yourtimername invalidate];
Но будьте осторожны, вы не можете остановить таймер, если он уже остановлен, потому что ваше приложение выйдет из строя.
Ответ 3
Поскольку iCoder говорит, что он должен быть недействительным в viewWillDisappear.
Я добавил следующее, чтобы убедиться. меня устраивает. Надеюсь, что это поможет (и добавляет, что ответы на идентификаторы не намерены копировать)
- (void) startTimer
{
[self stopTimer];
timer = [NSTimer scheduledTimerWithTimeInterval: 5.0
target: self
selector:@selector(onTick)
userInfo: nil repeats:YES];
}
- (void) stopTimer
{
if (timer) {
[timer invalidate];
timer = nil;
}
}
Ответ 4
4-летняя почта, я знаю, но, может быть, я смогу спасти NEXT парня от потери времени, пытаясь сделать недействительным NSTimer. Документация яблок объясняет это, и это работает для меня.
в .h
@property(nonatomic, retain) NSTimer *yourTimer;
@property(weak) NSTimer *repeatingTimer;
в .m
@synthesize yourTimer, repeatingTimer;
in viewDidLoad
yourTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimerInterval)(40.0/60.0)
target:self
selector:@selector(blink)
userInfo:nil
repeats:TRUE];
self.repeatingTimer = yourTimer;
в моем представленииDidDisappear
[repeatingTimer invalidate];
repeatingTimer = nil;
трюк заключается в назначении первого объекта NSTimer (слабому) NStimer и уничтожении этого объекта.
Ответ 5
Вы могли бы использовать две разные вещи
[timername invalidate];
Или вы могли бы использовать
timername = nil;
Ответ 6
Trick - использовать одноэлементный класс,
класс google myGlobals, который в основном используется как одноэлементный
Хотя если вы хотите использовать NSTimer
, то
позволяет сказать, что вид 1 - это то, что u входит в и просматривает 2, это тот, который u возвращается назад.
Итак, в случае представления 2 напишите NSTimer
, чтобы сделать недействительным таймер в viewDidLoad
(предположим, что у вас есть два отдельных класса для обоих представлений). Проблема возникает, потому что, когда вы идите на просмотр 1, вид 2 Таймеры будут освобождены. Итак, создайте класс Singleton и сохраните указатель NSTimer
, подобный этому
//to be done in viewDidLoad function
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
[globals.myTimer invalidate];
//to be done in viewDidUnload
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
globals.myTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0
target: self
selector:@selector(onTick)
userInfo: nil repeats:YES];
oh, и вот код класса myGlobals, который вам понадобится
//theglobals.h file
#import <Foundation/Foundation.h>
@interface theGlobals : NSObject
{
NSTimer *myTimer;
}
@property (nonatomic, copy) NSString *changeyes;
+(theGlobals*)sharedInstance;
@end
//implementaton .m file
#import "theGlobals.h"
@implementation theGlobals
@synthesize myTimer;
static theGlobals *sharedInstance;
- (id) init
{
return self;
}
+(theGlobals*)sharedInstance
{
if (!sharedInstance)
{
sharedInstance = [[theGlobals alloc] init];
}
return sharedInstance;
}
@end
Ответ 7
Просто отмените таймер
[таймер недействителен];