1

画面のボタンを目立たせようとしています。背景画像を変更し、数秒待ってから背景画像を復元し、次のボタンと同じようにします。

私はこのコードを書きました:

-(void)animateButtons
{
    UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, scroll.frame.origin.y-20, [UIScreen mainScreen].bounds.size.width, 20)];
    [lbl setTextAlignment:NSTextAlignmentCenter];
    for(int c=0;c<arr.count&&animationRunning;c++)
    {
        MenuItem * m = [arr objectAtIndex:c];
        [lbl setText:m.name];
        MyButton * b = (MyButton*)[self.view viewWithTag:c+1];
        NSMutableString * str = [[NSMutableString alloc]initWithString:m.image];
        [str appendString:@"_focused.png"];
        [b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
        sleep(2.5);
        str = [[NSMutableString alloc]initWithString:m.image];
        [str appendString:@"_normal.png"];
        [b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
        if(c==arr.count-1)
        {
            animationRunning=false;
        }
    }
}

そのメソッドはこの方法で呼び出されるため、UI スレッドをブロックしません。

[NSThread detachNewThreadSelector:@selector(animateButtons) toTarget:self withObject:nil];

ただし、最初のボタンの背景を変更するだけで、その後は何も変更しません。

NSLog を使用すると、メソッドがまだ実行されていることがわかりますが、ボタンに変更はありません。

どうすればこれを達成できますか?

私の悪い英語に感謝し、申し訳ありません。

4

2 に答える 2

1

バックグラウンド スレッドから UI プロパティを変更することはできません。これにより、クラッシュを含むあらゆる種類の問題が発生します。元のアルゴリズムを維持するには、UI の更新をメイン スレッドにディスパッチできます。しかし、これはスレッドの効率的な使用法ではありません。代わりに、メイン スレッドで実行される単純な NSTimer を使用してください。

于 2013-05-31T13:05:14.050 に答える
0

既に述べたように、UI の変更はすべてメイン スレッドで実行します。これは、あなたがやろうとしていることを達成するためのオプションです。NSTimer は必要ありません。

-(void)animateButtons
{
    for (...)
    {
        // set focused state
    }

    [self performSelector:@selector(restoreButtons) withObject:nil afterDelay:2.5];
}

-(void)restoreButtons
{
    for (...)
    {
        // set normal state
    }
}
于 2013-05-31T13:12:36.197 に答える