[英]NSTimer stops the first time I tell it to, then refuses to stop
我已經在我的UIViewController
標頭中聲明了NSTimer
:
NSTimer *mainTimer;
然后在實現中的viewWillAppear
方法中啟動它,因此:
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];
我有一個名為showInfo
用於翻轉視圖(標准實用程序應用模板)的showInfo
,它具有以下命令:
[mainTimer invalidate];
當我的應用啟動時,計時器就會啟動並執行操作。 我第一次點擊該按鈕並且視圖翻轉時,計時器停止。 當我完成flipSideViewController
並重新出現主視圖時,計時器再次啟動。 到目前為止,很好。 問題是隨后的按鈕按下(因此對[mainTimer invalidate]
調用不會使計時器停止。它一直在繼續。我可以來回翻轉所有想要的東西,並且它會不斷更新。對於笑容,我放了兩個連續invalidate
呼叫invalidate
,但這會導致崩潰。
更新:
找到了問題。 從flipSideViewController
返回后,我自己調用了viewWillAppear
,它將創建計時器。 運行循環還會自動調用viewWillAppear
,因此創建了第二個計時器。 這僅在我訪問過另一側后才發生,因此,當我第一次翻轉時,計時器(單個實例)將正常停止。 奇怪的是我可以創建兩個具有相同名稱的計時器...
一旦計時器失效,它將不再觸發。
因此,如果“計時器持續運行”,則它是一個不同的計時器。 確保您在說自己認為的實例。 我已經看到了很多錯誤,這些錯誤是開發人員分配/初始化一個實例,然后加載NIB並導致特定類的另一個實例起作用的。 我可以在這里看到類似的情況。
注意,不可能在作為計時器目標的對象的解除分配中使計時器無效。 計時器將保留目標,因此無法在首先使計時器無效的情況下正確地重新分配目標。
我只是做完全一樣的,它似乎對我有用。 我在xcode模板中做了什么:
轉到MainViewController.h並輸入:
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {
NSTimer* timer;
}
@property (nonatomic, retain) NSTimer* timer;
- (IBAction)showInfo:(id)sender;
@end
轉到MainViewController.m並添加:
@synthesize timer;
-(void) viewWillAppear:(BOOL)animated {
NSLog(@"Timer!");
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];
}
-(void) updateAll {
NSLog(@"run");
}
- (IBAction)showInfo:(id)sender {
[timer invalidate];
FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
}
就是這樣,它對我來說很好。 這樣有幫助嗎? 也許您的問題出在其他地方-您在updateAll
做什么?
從[NSTimer invalidate]
的文檔中:
阻止接收器再次觸發並請求將其從運行循環中刪除。
因此,我將致電作廢,然后釋放您的計時器。 首先,您似乎並沒有保留計時器。 因此,請在保留計時器時保留它,並在需要時使其失效,然后在失效后釋放它。
下一個視圖將出現,請確保您正在制作並保留一個新計時器。
viewWillAppear可能被多次調用。
創建計時器之前,請確保計時器已失效
[mainTimer invalidate];
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];
當然,如果您還在其他地方使計時器無效,則應將其分配為null。
[mainTimer invalidate];
mainTimer = NULL;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.