2014-04-22 36 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:将成为解决方案的一部分,但您真的需要花一些时间了解更多关于应用程序和控件如何工作的更多信息。简而言之,您的控件应该与适当的操作相关联;如果您想强制执行某些按钮的顺序,您可以根据需要启用或禁用某些按钮。