2014-04-22 62 views
-3

我有一個對象(scaleNotes)的數組,分配給我想要遍歷的按鈕。我希望應用程序等待按下第一組按鈕,然後等待第二組按鈕,等等。但是,目前我的應用程序凍結了該功能。如何等待按鈕按下目標c

包含數組的方法:

-(void)fingerScale :(UIButton*)button1 :(UIButton*)button2 :(UIButton*)button3 :(UIButton*)button4 :(UILabel*)label { 
Note *note = [[Note alloc]init]; 
for (int i = 0; i < [_scaleNotes count]; i++) { 
    note = _scaleNotes[i]; 
    label.text = note.noteName; 
    [note waitForNote:button1 :button2 :button3 :button4 :note]; 
    NSLog(@"Waiting... %i", i); 
} 
} 

的「waitForNote」的方法:

-(void)waitForNote:(UIButton *)button1 :(UIButton *)button2 :(UIButton *)button3 :(UIButton *)button4 :(Note*)Note { 
bool loop = YES; 
while (loop) { 
    switch ([Note.fingering count]) { 
     case 0: 
      loop = NO; 
      break; 
     case 1: 
      button1 = Note.fingering[0]; 

      if (button1.touchInside) { 
       loop = NO; 
      } 
      break; 
     case 2: 
      button1 = Note.fingering[0]; 
      button2 = Note.fingering[1]; 

      if (button1.touchInside && button2.touchInside) { 
       loop = NO; 
      } 
      break; 
     case 3: 
      button1 = Note.fingering[0]; 
      button2 = Note.fingering[1]; 
      button3 = Note.fingering[2]; 

      if (button1.touchInside && button2.touchInside && button3.touchInside) { 
       loop = NO; 
      } 
      break; 
     default: 
      break; 
    } 
} 
} 

我已被告知,使用addTarget:action:forControlEvents可以解決我的問題,而不是使用while循環,但我不確定如何將其實施到我的代碼中。請幫忙。

回答

1

要在迦勒的答案擴大一點點:

的iOS一樣,最現代化的互動OS'es,是事件驅動的。

您可以編寫響應事件的代碼。操作系統檢測事件,然後調用應用程序中響應這些事件的方法。

你不寫一個while循環,不斷循環,等待事情發生。

對於按鈕,您可以創建IBAction類型的方法,並將它們連接到您的按鈕(通常連接到「touch up inside」事件)。然後,當用戶點擊並釋放按鈕時,系統會調用您的操作方法。

對於滑塊,您可以編寫一個操作方法並將其附加到滑塊的「值更改」事件。然後,當用戶更改滑塊的值時,系統會給您打電話。

因此,你的按鈕,你會寫一個操作方法,並將其附加到您的按鈕。 (在Interface Builder中創建按鈕並將它們附加到動作中更爲常見,但您也可以使用代碼創建它們,然後使用您提到的-addTarget:action:forControlEvents:方法將它們附加到它們上。)

如果您有多個按鈕同樣的事情,但具有不同的值,您可能想要將所有按鈕附加到相同的IBAction方法,然後在每個按鈕上放置不同的標記值。然後在IBAction方法中,查看發件人上的標籤(調用該操作的按鈕)並使用它來確定哪個按鈕被按下。

+0

謝謝,我對這門語言仍然很陌生,這非常有幫助。 – Sc0urg3r

2

您的while循環是一個無限循環,這就是爲什麼您的應用程序似乎凍結。大多數GUI系統(包括iOS)不會那樣工作。您必須給應用程序的事件循環或運行循環時間來收集和處理事件。

-addTarget:action:forControlEvents:將成爲解決方案的一部分,但您真的需要花一些時間瞭解更多關於應用程序和控件如何工作的更多信息。簡而言之,您的控件應該與適當的操作相關聯;如果您想強制執行某些按鈕的順序,您可以根據需要啓用或禁用某些按鈕。