如何在一个数组中获取UIButtons标题,以便按时间顺序逐个显示

时间:2010-10-28 03:05:14

标签: iphone objective-c iphone-sdk-3.0 uibutton

在我的程序中,我在数组中有一系列UIButtons,我希望在执行具有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放在calculateSteps方法中,也放在那个while循环中但是无法工作。我想也许while循环功能足够快,以至于没有机会让NSTimer及时工作。

我知道如果我使用if = = 1,或者如果计时器== 2等,当计时器增加时,它可以工作,与之关联的每个按钮将在该间隔后改变。但是,当我尝试使用(timer == 1; timer< stones; timer ++)时,它不会逐个显示按钮标题,而是在完成循环后同时显示。我的逻辑错了吗?

另外,我也尝试将sleep(2)置于while循环中,它适用于每2秒出现的NSLog(@“marblesArray index中的数字:......”),但仍然按钮数组标题仍然while循环完成后同时显示。

我不确定如何才能让该数组中的按钮标题按时间顺序逐个显示。已经尝试了2天,但无法让它工作。 感谢是否有人可以帮助我。我不知道这是我的逻辑,还是有其他功能可以解决这个问题。

非常感谢您提前。

1 个答案:

答案 0 :(得分:0)

是的,您可以使用:

但我真的不明白你的代码和你的解释......

在计时器的目标选择器中,您可以使用静态int来计算刻度数 例子(非常简单):

[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;
  }
}