Как получить заголовок UIButtons в массиве, который будет отображаться по очереди в определенной последовательности - PullRequest
0 голосов
/ 28 октября 2010

В моей программе у меня есть серия 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 дней, но не мог заставить его работать. Ценю, если кто-нибудь там, кто может мне помочь. Я не знаю, является ли это моей логикой или есть другая функция, которая может быть использована для решения этой проблемы.

Большое спасибо заранее.

1 Ответ

0 голосов
/ 28 октября 2010

Да, вы могли бы использовать:

  • NSTimer
  • или просто executeSelector: withObject: afterDelay: любого подкласса NSObject.
    Вы не можете использовать сон или цикл в главном потоке. Это заблокирует HMI.

Но я не совсем понимаю ваш код и ваше объяснение ...

В целевом селекторе таймера у вас может быть статическое целое число для подсчета количества тиков пример (очень простой):

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTimer) userInfo:nil repeats:NO];

-(void)onTimer{
  static int ticks = 0;
  ticks++;
  if (ticks==1) {
    //TODO
  } else if (ticks==2) {
    //TODO
  } else if (ticks==3) {
    //TODO
  } else {
    //TODO
    ticks=0;
  }
}
...