1

誰かが私を助けてくれることを望んでいました。ユーザーがボタンを押すと、ボタン番号に対応する数字の配列が生成され、forループを使用して各ボタンを順番にオン/オフします。問題は、配列内のすべてのボタンがオンになり、最後のボタンだけがオフになることです。時間遅延コマンドを使用した perfomSelector が for ループの最後でのみ実行されるようなものですが、その理由を知っている人はいますか?

私が使用しているコードは次のとおりです。

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

}
4

3 に答える 3

1

問題は明らかです。numLit を変更する for ループを通過しています。セレクターを 1 秒で実行したいのですが、最初のセレクターが起動するまでに、numLit を最後の番号に変更しているため、すべての起動が発生します。最後のボタンを変更します...番号をbuttonUnlitに渡すことでこれを修正する必要があります。そうすれば、変更し続けるクラス変数に依存しなくなります...次のようなものです

- (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];

    }

}
于 2012-01-10T20:45:01.547 に答える
0

ダニエル-ここであなたの助けをありがとう、私のために働いた解決策です。

- (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]];

    }

}
于 2012-01-11T23:05:19.050 に答える
0

ダニエルのソリューションはあなたの問題を解決するはずです。

ボタンのサブクラス化を考えたことはありますか? 次に、サブクラスをコーディングして、それ自体を照らしたり消したりする方法を理解します。

このサブクラスはほとんどロジックを必要とせず、質問に投稿されたコードが削減されます。
プロパティ
• litFileName
• unlitFileName
メソッド
-(void)light
-(void)unlight

于 2012-01-10T20:53:38.407 に答える