В моей программе у меня есть серия UIButton-ов в массиве, которые я бы хотел, чтобы их заголовок отображался каждый раз по одному в временной последовательности после выполнения функции, имеющей цикл while.
У меня есть IBAction, прикрепленный к кнопкам, и при касании вызовет другую функцию, которая выполнит некоторую операцию и в конце изменит заголовок UIButtons в этом массиве.
Проблема в том, что после выполнения этого метода он изменил весь заголовок кнопок одновременно, но я хочу, чтобы заголовок отображался один за другим в определенной последовательности.
Чтобы проиллюстрировать наглядно, вот мои коды:
-(IBAction)touchedButton1:(id)sender
{
[self calculateSteps:0];
}
-(void)calculateSteps:(NSUInteger)hole_index2
{
index = hole_index2;
NSNumber *tempNumber = [marblesArray objectAtIndex:index];
stones = [tempNumber intValue];
[marblesArray replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:0]];
[[buttonsArray objectAtIndex:index] setTitle:[NSString stringWithFormat:@"%d", [NSNumber numberWithInt:0].intValue] forState:UIControlStateNormal];
while(stones > 0) {
if (player == PLAYER_A && stones >= 1 && index == 6) {
NSNumber *tempNumber3 = [storeArray objectAtIndex:0];
NSUInteger tempInt3 = [tempNumber3 intValue];
tempInt3++;
[storeArray replaceObjectAtIndex:0 withObject:[NSNumber numberWithInt:tempInt3]];
[buttonPlayerA setTitle:[NSString stringWithFormat:@"%d", [NSNumber numberWithInt:tempInt3].intValue] forState:UIControlStateNormal];
stones--;
if (stones == 0) { // end in PLAYER A's store
NSLog(@"end in big hole player A");
return;
}
}
if (player == PLAYER_B && stones >= 1 && index == 12) {
NSNumber *tempNumber4 = [storeArray objectAtIndex:1];
NSUInteger tempInt4 = [tempNumber4 intValue];
tempInt4++;
[storeArray replaceObjectAtIndex:1 withObject:[NSNumber numberWithInt:tempInt4]];
[buttonPlayerB setTitle:[NSString stringWithFormat:@"%d", [NSNumber numberWithInt:tempInt4].intValue] forState:UIControlStateNormal];
stones--;
if (stones == 0) { // end in PLAYER B's store
NSLog(@"end in big hole player B");
return;
}
}
index++;
if (index >= NUM_HOLES) index = 0;
NSNumber *tempNumber2 = [marblesArray objectAtIndex:index];
tempInt2 = [tempNumber2 intValue];
tempInt2++;
[marblesArray replaceObjectAtIndex:index withObject:[NSNumber numberWithInt:tempInt2]];
NSLog(@"Number in marblesArray index: %d", [NSNumber numberWithInt:tempInt2].intValue);
[[buttonsArray objectAtIndex:index] setTitle:[NSString stringWithFormat:@"%d", [NSNumber numberWithInt:tempInt2].intValue] forState:UIControlStateNormal];
stones--;
}
}
Итак, я попытался поместить NSTimer в метод Calculate, а также в цикл while, но не смог приступить к работе. Я предполагаю, что, возможно, цикл while работает достаточно быстро, чтобы у него не было возможности вовремя запустить NSTimer.
Я знаю, что это может сработать, если я использую таймер == 1 или таймер == 2 и т. Д. При увеличении таймера, каждая связанная с ним кнопка будет меняться после этого интервала. Тем не менее, когда я попытался использовать для (таймер == 1; таймер <камни; таймер ++), он не показывает заголовок кнопок по одной, но одновременно после того, как это сделано с циклом. Я не прав с моей логикой? </p>
Кроме того, я попытался поместить sleep (2) в цикл while, он работает для NSLog (@ "Number in marblesArray index: ..."), появляющегося каждые 2 секунды, но все еще заголовок массива кнопок по-прежнему показывается одновременно после завершения цикла.
Я не уверен, как я могу получить название кнопок в этом массиве, чтобы они отображались по очереди в определенной последовательности. Пытался в течение 2 дней, но не мог заставить его работать.
Ценю, если кто-нибудь там, кто может мне помочь. Я не знаю, является ли это моей логикой или есть другая функция, которая может быть использована для решения этой проблемы.
Большое спасибо заранее.