我有一个对象数组(scaleNotes),它们被分配给我想要迭代的按钮。我希望应用程序等待按下第一组按钮,然后等待第二组,依此类推。但是,通过该功能,我目前将应用程序冻结。
包含数组的方法:
-(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);
}
}
&#34; waitForNote&#34;方法:
-(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循环,但我不确定如何将其实现到我的代码中。请帮忙。
答案 0 :(得分:2)
您的while
循环是一个无限循环,这就是您的应用似乎冻结的原因。大多数GUI系统 - 包括iOS - 都不会以这种方式工作。您必须为应用程序的事件循环或运行循环时间来收集和处理事件。
-addTarget:action:forControlEvents:
将成为解决方案的一部分,但您确实需要花一些时间来了解有关应用和控件如何工作的更多信息。简而言之,您的控制应与适当的行动联系起来;如果您想对按钮强制执行某些订单,可以根据需要启用或禁用某些按钮。
答案 1 :(得分:1)
稍微扩展Caleb的答案:
iOS与大多数现代互动操作系统一样,是事件驱动的。
您编写响应事件的代码。操作系统检测事件,然后调用应用程序中响应这些事件的方法。
你不会写一个循环,一直循环,等待事情发生。
对于按钮,您可以创建IBAction类型的方法,并将它们连接到按钮(通常连接到“内部触摸”事件。)然后,当用户点击并释放按钮时,系统会调用您的操作方法
对于滑块,您可以编写一个操作方法并将其附加到滑块的“值已更改”事件。然后,当用户更改滑块的值时,系统会给您打电话。
因此,对于您的按钮,您可以编写一个动作方法并将其附加到按钮上。 (创建按钮并将它们附加到Interface Builder中的操作更常见,但您也可以在代码中创建它们,然后使用您提到的-addTarget:action:forControlEvents:
方法附加它们。)
如果您有多个按钮执行相同但具有不同值的按钮,您可能希望将所有按钮附加到相同的IBAction方法,然后在每个按钮上添加不同的标记值。然后在您的IBAction方法中,查看发送者上的标签(调用该操作的按钮)并使用它来确定按下了哪个按钮。