2013-02-21 75 views
-1

有無myTimer類一廣東話暫停和恢復的NSTimer另一個類

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

然後通過UIButton的在mainviewcontroller暫停和恢復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。沒有已知的類選擇器無效和火的方法

感謝您的幫助。

+0

如果你想訪問創建的任何對象/從兩課「擁有」的一類(或類偶數另一個實例一) ,您必須以某種方式獲取指向實例的指針,該指針「擁有」對象並通過該指針訪問對象。 – 2013-02-21 17:12:17

+0

FWIW,使用「classOne」和「oneClass」等名稱,然後命名您的對象爲「one」或「oneClass」通常很混亂。嘗試使用更多描述性名稱,您會發現它使生活變得更加輕鬆,並幫助您診斷問題區域。看起來類'One'實際上是一個視圖控制器,所以它應該被命名爲'timerPopupViewController'。然後,在您的mainViewController中,您可以創建一個名爲'timerPopup'的對象,清楚地告訴您它是什麼:) – JiuJitsuCoder 2013-02-21 17:32:36

回答

1

myTimer是否設置爲ClassOne的屬性?

@property (nonatomic, strong) NSTimer *myTimer; 

@synthesize myTimer; 

然後,你可以調用你的mainviewcontroller [oneClass.myTimer invalidate];[oneClass.myTimer fire];

+0

myTimer被設置爲名爲One的類中的屬性。 class name只是一個不是classone – user1452248 2013-02-21 17:07:10

+0

所以如果我定義@property(nonatomic,strong)ClassOne * oneclass;在mainviewcontroller中是對還是錯 – user1452248 2013-02-21 17:13:11

+0

就我所知,這是正確的。在這種情況下,你可以調用'[self.oneclass.myTimer invalidate];'''[self.oneclass.myTimer fire]'。 – 2013-02-21 17:16:04

0

當你從其他類調用定時器時,你需要通過創建第一類對象來調用。

或者您可以向第二類的第一類發送通知,該通知將被遵守,然後您的所需方法將被調用。

1

看起來您正在viewDidLoad方法調用中創建計時器對象。在嘗試操作計時器屬性之前,確保視圖實際上已加載,否則結果將不令人愉快。此外,就像@Anoop Vaidya所說的,你需要確保在嘗試訪問其屬性之前初始化一個類的對象。要做到這一點的一個好方法是修改您的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; 
    } 
    } 
}