2010-08-18 22 views
31
nasıl engellenir

Hey yüzden sadece bir örnek uygulama yapıyorum ve ben biraz sorun yaşıyorum, Yani ben bir tablo görünüme sahip ve sonra ben birkaç satır olması ve kullanıcı bir satır tıkladığında yeni bir götüren görünüm. Bu görüntüde müzik çalmak için bir düğme var. Müzik süresine ve kalan süreye göre kaydırıcı çubuk artışı yapmak için bir zamanlayıcı kullanıyorum. i sol üst düğmesi ile tablo görünümüne geri döndüğünüzdeNSTimer

Şimdi benim sorunum, ne ben NSTimer durdurur, böylece koymak gerekiyor?

bu şimdiye kadar ne ben tekrarlanmasını alamayan geçerli: EVET zamanlayıcı durdurmak için. Böyle

#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 

cevap

13

: Uygulamanız çökmesine çünkü zaten durdu eğer

[yourtimername invalidate]; 

Ama dikkatli olun, zamanlayıcıyı durdurmak olamaz.

+2

Uygulanmayan bir zamanlayıcıyı geçersiz kıldığında uygulama çökmez. – IgniteCoders

67

aşağıdaki kodu kullanın. 'da çalışır. Ancak, yalnızca zamanlayıcımızın çalışma modunda olması durumunda çağrılması gerektiğini aklınızdan çıkarmayın, aksi takdirde uygulama çökecektir.

- (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]; 
} 
+0

Sabah bunu denemek için gidiyorum, 2 AM, bütün gün boyunca bu şekilde kalmış. Umarım çözümün işe yarıyor. Birkaç saat içinde bu yazıya geri döneceğim. – cruisx

+21

Birisi size bu şeyin size geri dönmesini yaklaşık 3 yıl geç olduğunu söylemelidir ... Her iki durumda da, sorunumu çözdüm! –

+0

@JonMattingly lol –

8

iCoder, viewWillDisappear'da geçersiz kılınması gerektiğini söylüyor.

Sadece aşağıdaki emin olmak için ekledi. benim için çalışıyor. o yardımcı olur (ve cevap kopyalamak için niyet yok icoders ekler)

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

} 
1

Trick Bir tek sınıf kullanmaktır Umut u dilek yoksa rağmen çoğunlukla tekil olarak kullanılır google myGlobals sınıf NSTimer kullanmak ardından

u gitmek ve görünümü 2 u viewDidLoad zamanlayıcıyı geçersiz geri

2. Yani bakış 2 durumunda, NSTimer yazmalıyım biri (ki görünümü 1'dir diyelim Her iki görünüm için iki ayrı dersiniz olduğunu varsayarak s) .Görüntü 1'e gittiğinde, görünüm 2 Zamanlayıcıları dealloc olacağı için problem meydana gelecektir. Yani, bir Singleton sınıf oluşturun ve oh bu

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

gibi NSTimer işaretçi kaydetmek ve burada u

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

İki farklı şeyler kullanın Could gerekecektir myGlobals sınıf kodu

[timername invalidate]; 

Veya kullanın Could

timername = nil; 
+0

İkincisi aslında zamanlayıcıyı durdurmayacak ve ilk olanı Ağustos 2010'da yayınlandı. –

6

4 yaşındaki sonrası, biliyorum ama belki bir NSTimer geçersiz çalışırken zaman israf gelen SONRAKİ adamı kaydedebilirsiniz. Elmalar belgeleri açıklar ve benim için çalışır. .h

@property(nonatomic, retain) NSTimer *yourTimer; 
@property(weak) NSTimer *repeatingTimer; 

yılında

.Benim viewDidDisappear

[repeatingTimer invalidate]; 
    repeatingTimer = nil; 

hile

yourTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimerInterval)(40.0/60.0) 
              target:self 
              selector:@selector(blink) 
              userInfo:nil 
              repeats:TRUE]; 

    self.repeatingTimer = yourTimer; 

viewDidLoad

m

@synthesize yourTimer, repeatingTimer; 

(zayıf) NSTimer nesne ve BU nesneyi öldürme ilk NSTimer atama içindedir.

0

Sadece zamanlayıcı geçersiz

[zamanlayıcı invalidate];

İlgili konular