2012-01-10 3 views
1

Я надеялся, что кто-то сможет мне помочь. Я пишу простую игру, когда пользователь нажимает кнопку, генерируется массив чисел, соответствующих номерам кнопок, тогда цикл for используется для поочередного включения и выключения каждой кнопки с временной задержкой. Проблема в том, что все кнопки в массиве включаются, и только последний отключается. Это похоже на perfomSelector с командой задержки времени, выполняемой только в конце цикла for, кто-нибудь знает, почему?performSelector с задержкой по времени не работает в петле - iPhone

Вот код, который я использую:

- (IBAction)buttonPushed:(id)sender; 
{ 
    //creat random array of buttons 
    [self randomArray]; 

    //loop through each button in array and turn them on and off 
    for (NSString *i in gameArray) 
    { 
     int butNum = [i intValue]; 

     numLit = [[NSNumber alloc] initWithInt:butNum]; 

     //turn button on 
     [self buttonLit]; 

     //turn button off 
     [self performSelector:@selector(buttonUnLit) withObject:nil afterDelay:1.0]; 

    } 

} 

- (void)randomArray 
{ 
    //initialize array 
    gameArray = [[NSMutableArray alloc] initWithArray:NULL]; 

    //************* Build random array of numbers ******************* 
    for (int i = 0; i < level; i++) 
    { 
     //generate a number from 0 to 11 at random 
     NSInteger num = (arc4random() % 11); 

     //add number to array 
     [gameArray addObject:[NSString stringWithFormat:@"%i", num]]; 
    } 
    return; 

} 

- (void)buttonLit 
{ 
    int numLitInt = [numLit intValue]; 


    if (numLitInt == 0) 
    { 
     [button0 setImage:[UIImage imageNamed:@"0(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 1) 
    { 
     [button1 setImage:[UIImage imageNamed:@"1(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 2) 
    { 
     [button2 setImage:[UIImage imageNamed:@"2(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 3) 
    { 
     [button3 setImage:[UIImage imageNamed:@"3(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 4) 
    { 
     [button4 setImage:[UIImage imageNamed:@"4(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 5) 
    { 
     [button5 setImage:[UIImage imageNamed:@"5(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 6) 
    { 
     [button6 setImage:[UIImage imageNamed:@"6(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 7) 
    { 
     [button7 setImage:[UIImage imageNamed:@"7(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 8) 
    { 
     [button8 setImage:[UIImage imageNamed:@"8(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 9) 
    { 
     [button9 setImage:[UIImage imageNamed:@"9(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 10) 
    { 
     [button10 setImage:[UIImage imageNamed:@"10(lite).png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 11) 
    { 
     [button11 setImage:[UIImage imageNamed:@"11(lite).png"] forState:UIControlStateNormal]; 
     return; 
    } 

} 


- (void)buttonUnLit 
{ 
    int numLitInt = [numLit intValue]; 


    if (numLitInt == 0) 
    { 
     [button0 setImage:[UIImage imageNamed:@"0.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 1) 
    { 
     [button1 setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 2) 
    { 
     [button2 setImage:[UIImage imageNamed:@"2.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 3) 
    { 
     [button3 setImage:[UIImage imageNamed:@"3.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 4) 
    { 
     [button4 setImage:[UIImage imageNamed:@"4.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 5) 
    { 
     [button5 setImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 6) 
    { 
     [button6 setImage:[UIImage imageNamed:@"6.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 7) 
    { 
     [button7 setImage:[UIImage imageNamed:@"7.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 8) 
    { 
     [button8 setImage:[UIImage imageNamed:@"8.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 9) 
    { 
     [button9 setImage:[UIImage imageNamed:@"9.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 10) 
    { 
     [button10 setImage:[UIImage imageNamed:@"10.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 11) 
    { 
     [button11 setImage:[UIImage imageNamed:@"11.png"] forState:UIControlStateNormal]; 
     return; 
    } 

} 

ответ

1

проблема Youre очевидно, вы собираетесь через цикл changining в numLit, вы хотите селекторы должны быть выполнены в течение одной секунды, к тому времени, первый селектор срабатывает, вы уже изменили numLit на последний номер, и поэтому все огни изменяют последнюю кнопку ... Вы должны исправить это, передав число to buttonUnlit, таким образом, вы arent зависят от переменной класса, которую вы продолжают меняться ... что-то вроде

- (void)buttonUnLit:(NSNumber*)number 
{ 
    int numLitInt = [number intValue]; 


    if (numLitInt == 0) 
    { 
     [button0 setImage:[UIImage imageNamed:@"0.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 1) 
    { 
     [button1 setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 2) 
    { 
     [button2 setImage:[UIImage imageNamed:@"2.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 3) 
    { 
     [button3 setImage:[UIImage imageNamed:@"3.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 4) 
    { 
     [button4 setImage:[UIImage imageNamed:@"4.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 5) 
    { 
     [button5 setImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 6) 
    { 
     [button6 setImage:[UIImage imageNamed:@"6.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 7) 
    { 
     [button7 setImage:[UIImage imageNamed:@"7.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 8) 
    { 
     [button8 setImage:[UIImage imageNamed:@"8.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 9) 
    { 
     [button9 setImage:[UIImage imageNamed:@"9.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 10) 
    { 
     [button10 setImage:[UIImage imageNamed:@"10.png"] forState:UIControlStateNormal]; 
     return; 
    }else if (numLitInt == 11) 
    { 
     [button11 setImage:[UIImage imageNamed:@"11.png"] forState:UIControlStateNormal]; 
     return; 
    } 

} 

и

- (IBAction)buttonPushed:(id)sender; 
{ 
    //creat random array of buttons 
    [self randomArray]; 
    float dalay=1.0f; 
    //loop through each button in array and turn them on and off 
    for (NSString *i in gameArray) 
    { 
     int butNum = [i intValue]; 

     NSNumber *num = [[NSNumber alloc] initWithInt:butNum]; 

     //turn button on 
     [self buttonLit]; 

     //turn button off 
     [self performSelector:@selector(buttonUnLit) withObject:num afterDelay:delay]; 
     delay+=0.5f; 
     [num release]; 

    } 

} 
+0

+1 @Daniel, но даже это было очевидно для нас, что проблема в том, что не было очевидно OP –

+0

достаточно Fair ...... – Daniel

+0

Daniel - Спасибо за предложение, я попытался это , Кнопки включаются и выключаются, но они включаются сразу, а затем все выключается сразу. То, что я хочу сделать, - это поочередно включать и выключать кнопки. например, кнопка 1 включается на одну секунду, затем выключается, затем кнопка 5 включается на одну секунду, затем выключается и т. д. Имейте в виду, что я программировал только 4 месяца ... Еще раз спасибо за вашу помощь! – user961632

0

Решение Daniel должно решить вашу проблему.

Вы считали, что подклассификация кнопки? Затем кодирование подкласса, чтобы знать, как осветить и осветить себя.

Этот подкласс потребует очень мало логики, и ваш код, размещенный в вашем вопросе, будет уменьшен.
свойства
• litFileName
• unlitFileName
методы
-(void)light
-(void)unlight

+0

Спасибо за предложение ! – user961632

0

Daniel - Еще раз спасибо за вашу помощь здесь это решение, которое работает для меня.

- (IBAction)buttonPushed:(id)sender; 
{ 
    //creat random array of buttons 
    [self randomArray]; 

    //loop through each button in array and turn them on and off 
    for (NSString *i in gameArray) 
    { 
     int butNum = [i intValue]; 

     NSNumber *number = [[NSNumber alloc] initWithInt:butNum]; 

     //turn button on 
     [self buttonLit:(NSNumber*)number]; 

     //turn button off 
     [self performSelector:@selector(buttonUnLit:) withObject:number afterDelay:1.0]; 

     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow: 1.0]]; 

    } 

}