2013-06-12 59 views
0

更新1識別故事板的UIButton用於編輯工作在代碼

予固定的環不通過將條件dealCard而不是在startPause停止的問題。

更新1

更新0

- (IBAction)startPause: (UIButton *)sender{ 
    NSString *buttonTitle = sender.currentTitle; 
    if ([buttonTitle isEqualToString: @"Pause"]) { 

     [self.myButton setTitle:@"Resume" forState:UIControlStateNormal]; 
     [timer invalidate]; 
    } 
    else 
    { 
     [self.myButton setTitle:@"Pause" forState:UIControlStateNormal]; 
     if ([self.deal length]>cardNum) { 
      timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                target:self 
                selector:@selector(dealCard) 
                userInfo:nil 
                repeats:YES]; 
     } 
     else 
      [timer invalidate]; 

    } 
} 

除了上述修改後的代碼,我添加一個IBOutlet屬性myButton爲由多個人的建議,並改變了NSTimerrepeats:YESrepeats:NO,我從dealCard刪除了呼叫[self startPause]。現在系統似乎起作用,只是「while」條件self.deal length]>cardNum的故障不能正確地使條款中的NSTimer無效。

我可以使用一些關於爲什麼invalidate沒有被解僱的反饋。

更新0

Continuing this answered question,我想添加一個 「startPause」 的UIButton的 「暫停」 的一部分。點擊按鈕後,我希望它的標題和動作是「暫停」,並且我希望它的標題在「恢復」和「暫停」之間切換。

這個按鈕是在Storyboard中創建的,我想不出如何爲按鈕創建一個標識符,所以我可以用編程方式改變它。我懷疑我需要增強按鈕的IBAction方法以包含「發件人」,但我可能會離開。

目前我有以下未完成的代碼。

- (IBAction)startPause: (UIButton *)sender{ 
    NSString *buttonTitle = sender.currentTitle; 
    if ([buttonTitle isEqual: @"Pause"]) { 
    [myButton setTitle:@"Resume" forState:UIControlStateNormal]; //**** myButton is what?  

    if ([self.deal length]>cardNum) { 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
               target:self 
               selector:@selector(dealCard) 
               userInfo:nil 
               repeats:NO]; 
    } 
    } 
} 

(我知道我還沒有開始代碼的「其他」部分)。

如何掛鉤myButton上面我在故事板startPause按鈕?

+0

您是否將故事板中的'touch up inside'事件鏈接到您的IBAction? – danypata

+0

你是否試圖以編程方式改變按鈕的動作?按下按鈕後,上面的代碼是否會被觸發? – Dan

+0

對不起,我以前沒有看到這些評論。是的,我確實在故事板中有'連接到內部'。是的,我試圖通過編程方式改變按鈕的標題,並且點擊按鈕時觸發上面的代碼。 – zerowords

回答

1

聽起來好像你在故事板中有一些東西接錯了。對於你的UIButton(myButton),你應該有兩個鉤子。.h文件

(1) @property (strong, nonatomic) IBOutlet UIButton *myButton; 
(2) - (IBAction)startPause:(id)sender; 

(1)將允許您將.m文件中的任何地方設置您的按鈕標題,特別是在你的myButtonAction事件。 (2)當你將按鈕連接到你的.h文件時,你應該選擇touchUpInside,這種方式當點擊按鈕時,myButtonAction將觸發事件。

EDIT2(解決的NSTimer)

- (IBAction)startPause: (UIButton *)sender{ 
NSString *buttonTitle = sender.currentTitle; 
if ([buttonTitle isEqualToString: @"Pause"]) { 

    [self.myButton setTitle:@"Resume" forState:UIControlStateNormal]; 
    [timer invalidate]; 
} 
else 
{ 
    [self.myButton setTitle:@"Pause" forState:UIControlStateNormal]; 
    if ([self.deal length]>cardNum) 
    { 
     if (!myTimer.isValid) 
     { 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
               target:self 
               selector:@selector(dealCard) 
               userInfo:nil 
               repeats:YES]; 
     } 
     else 
     { 
     //do nothing - timer has been created already 
     } 
    } 
    else 
    { 
     [timer invalidate]; 
    } 
} 
} 

This doc也可能會有幫助。

+0

你是說我需要做Aaron在他的回答中提出的第二個建議,並添加一個'IBOutlet'以及我已經擁有的'IBAction'?我還需要'IBAction'中的'sender'?謝謝。 – zerowords

+0

IBAction只處理...被按下的動作(在你的情況下)。 IBOutlet允許您操作視圖中的對象。 如果你只連接IBAction,你只能迴應被按下的按鈕。同樣,如果你只連接IBOutlet,你有一個編程式編輯按鈕,不會對被觸摸做出響應。 – Dan

+0

是的,我明白IBAction處理按鈕的按下,IBOutlet將使我能夠從'dealCard'方法返回。我是否也需要'sender'來訪問按鈕的標題?我很肯定答案是肯定的。所以,在'dealCard'結尾我的命令是什麼?是,'[self startPause:@「myButton」]',還是什麼? – zerowords

1

startPause方法的sender參數應該是UIButton你想要的,所以你可能可以逃脫直接修改sender。也就是說,在代碼片段中用sender代替myButton

另一種方法是,如果您從其他任何地方暫停/繼續,仍然可以獲取按鈕並更新其標題,則該按鈕的編號爲IBOutlet。在你的類@interface部分,您將有類似:

@property (nonatomic, strong) IBOutlet UIButton *pauseResumeButton; 

,然後當你想引用您可以使用按鈕或者self.pauseResumeButton_pauseResumeButton

+0

謝謝。不管你信不信,我只是試着把'myButton'改成'sender',但後來我遇到了下一個問題。 'dealCard'方法的最後一行是'[self startPause]'。現在最後的指令是否需要像'[self startPause:sender]'一樣?什麼是'發件人'?或者是什麼? – zerowords

+0

不,當您觸摸按鈕時會調用'startPause:'方法。您不必在代碼中調用它。 'sender'是一個指向調用方法調用的對象的指針,所以在這種情況下就是你觸及的'UIButton'。 – HAS

+0

但是,我想持續返回到'startPause:...'直到退貨暫停,所以我需要最後一行,但我不知道如何改變它。 – zerowords