簡體   English   中英

無法暫停並在另一節課中恢復nstimer

[英]Cant pause and resume nstimer in another class

在類1中定義了myTimer

 @property (nonatomic, retain) NSTimer *myTimer;

 @synthesize myTimer;

- (void)viewDidLoad {

 myTimer = [NSTimer scheduledTimerWithTimeInterval:2.6
                             target:self
                           selector:@selector(updateView:)
                           userInfo:nil
                            repeats:YES];

[super viewDidLoad];

}

- (void)updateView:(NSTimer *)theTimer
{
if  (index < [textArray count])
{

   self.textView.text = [self.textArray objectAtIndex:index];
   self.imageView.image = [self.imagesArray objectAtIndex:index];
   index++;
}else{

    index = 0;

}

我想在mainviewcontroller類中暫停並恢復myTimer。

在mainviewcontroller.h中

@property (nonatomic, strong) ClassOne *oneclass;

並在mainviewcontroller.m中

@synthesize oneclass;

然后通過mainviewcontroller中的UIButton暫停並恢復myTimer

-(void)playpauseAction:(id)sender {

if([audioPlayer isPlaying])
{
    [sender setImage:[UIImage imageNamed:@"music.png"] forState:UIControlStateNormal];

    [audioPlayer pause];

    [myTimer invalidate];


}else{

    [sender setImage:[UIImage imageNamed:@"audiostop.png"] forState:UIControlStateNormal];

    [audioPlayer play];

    [myTimer fire];

    if(isFirstTime == YES)
    {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:06.0
                                                      target:self
                                                    selector:@selector(displayviewsAction:)
                                                    userInfo:nil
                                                     repeats:NO];
        isFirstTime  = NO; } } }

但是出現語義問題和ARC語義問題錯誤

未知接收者myTimer您的意思是NSTimer。 沒有已知的選擇器失效和觸發類方法

感謝幫助。

是否將myTimer設置為ClassOne的屬性?

@property (nonatomic, strong) NSTimer *myTimer;

@synthesize myTimer;

然后,您可以調用[oneClass.myTimer invalidate]; [oneClass.myTimer fire]; 在您的mainviewcontroller中。

看來您正在viewDidLoad方法調用中創建計時器對象。 在嘗試操作timer屬性之前,請確保已實際加載視圖,否則結果將不令人滿意。 同樣,就像@Anoop Vaidya所說的那樣,您需要確保在嘗試訪問類的屬性之前初始化類One對象。 做到這一點的一種好方法是通過以下方式修改mainViewController代碼:

-(void)playpauseAction:(id)sender {
   //This code assumes there is an ivar in mainViewController called aClassOneObject
   if([audioPlayer isPlaying]) {
     [sender setImage:[UIImage imageNamed:@"music.png"] forState:UIControlStateNormal];
     [audioPlayer pause];

     if (aClassOneObject)
       [[aClassOneObject myTimer] invalidate];
     else
       //Log error that the aClassOneObject was nil

   } else {
     [sender setImage:[UIImage imageNamed:@"audiostop.png"] 
             forState:UIControlStateNormal];

     [audioPlayer play];

     if (aClassOneObject)
       [[aClassOneObject myTimer] fire];
     else
       //Log error that the aClassOneObject was nil

     if(isFirstTime == YES) {
       self.timer = [NSTimer scheduledTimerWithTimeInterval:06.0
                                                     target:self
                                                   selector:@selector(displayviewsAction:)
                                                   userInfo:nil
                                                    repeats:NO];
       isFirstTime  = NO;
     }
   } 
}

當您從其他類調用計時器時,需要通過創建第一類的對象進行調用。

或者,您可以從第二類向第一類發送通知,該通知將被觀察,然后將調用您所需的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM