/ / Как да получите UIButtons заглавие в масив, който да се показва поотделно в последователност от време - iphone, object-c, iphone-sdk-3.0, uibutton

Как да получите UIButtons заглавие в масив, за да се покаже всеки един по един в определена последователност - iphone, objective-c, iphone-sdk-3.0, uibutton

В моята програма, имам серия от UIButtons в масив, който бих искал неговото заглавие да се показва всеки един по един в последователност във времето след изпълнение на функция, която има време цикъл.

Имам 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, а също и в този цикъл, но не можех да се заемем с работата. Предполагам, че може би цикличната функция е достатъчно бърза, за да не успее да получи NSTimer да работи във времето.

Знам, че може да работи, ако използвам, ако таймер == 1, илииначе, ако таймерът == 2 и т.н., когато таймерът се увеличи, всеки бутон, свързан с него, ще се промени след този интервал. Въпреки това, когато се опитах да се използва за (таймер == 1; таймер <камъни; таймер + +), тя не показва бутоните заглавие всеки един по един, но едновременно след това е направено с линия.

Също така, аз се опитах да поставя съня (2) в това времецикъл също, той работи за NSLog (@ "Номер в индекса marblesArray: ...") се появяват на всеки 2 секунди, но все още бутонът матрица на бутоните все още се показва едновременно след като цикъла завърши.

Не съм сигурен как мога да получа заглавието на бутонитетози масив да се показва всеки един по един в последователност във времето. Опитвам се за 2 дни, но не можех да го накарам да работи. Оценявам, ако някой там, който може да ми помогне. Не знам дали е моя логика или има друга функция, която може да се използва за решаване на този проблем.

Благодаря много предварително.

Отговори:

0 за отговор № 1

Да, можете да използвате:

  • NSTimer
  • или просто performSelector: withObject: afterDelay: от всеки подклас на NSObject.
    Не можете да използвате съня или цикъла в основната нишка. Той ще блокира HMI.

Но аз наистина не разбирам твоя код и твоето обяснение ...

В целевия селектор на таймера може да имате статичен 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;
}
}