0

私はしばらくの間この問題の答えを探していましたが、運がありませんでした。

問題は次のとおりです。4つのUILabelと、それに対応するサウンドクリップがあります。サウンドクリップの再生時に、各ラベルに強調表示されたテキストを表示したいと思います。

問題は、シミュレータでテストしたときに最後のラベルだけが強調表示されることです。

これが私が試したいくつかのことです:

[self playSound:@"this"];
[thisLabel setTextColor:[UIColor orangeColor]];
sleep(1);
[self playSound:@"is"];
[thisLabel setTextColor:[UIColor blackColor]];
[isLabel setTextColor:[UIColor orangeColor]];
[self playSound:@"a"];
[isLabel setTextColor:[UIColor blackColor]];
[aLabel setTextColor:[UIColor orangeColor]];
[self playSound:@"word"];
[aLabel setTextColor:[UIColor blackColor]];
[currentWord setTextColor:[UIColor orangeColor]];

これは、シミュレーターでテストしたときに、最後のラベルのみが強調表示されて表示されることを発見したときです。

次に試したのは、playSound関数の最後にこの関数を呼び出すことです。

- (void)shiftHighlight:(NSString *)word
{
    UILabel *currentWord = [self currentWord];
    UILabel *thisLabel = [self thisLabel];
    UILabel *isLabel = [self isLabel];
    UILabel *aLabel = [self aLabel];
    if ([word isEqualToString:@"this"])
    {
        [thisLabel setHighlighted:YES];

        [isLabel setHighlighted:NO];
        [aLabel setHighlighted:NO];
        [currentWord setHighlighted:NO];
    } else if ([word isEqualToString:@"is"]) {
        [isLabel setHighlighted:YES];

        [thisLabel setHighlighted:NO];
        [aLabel setHighlighted:NO];
        [currentWord setHighlighted:NO];
    } else if ([word isEqualToString:@"a"]) {
        [aLabel setHighlighted:YES];

        [thisLabel setHighlighted:NO];
        [isLabel setHighlighted:NO];
        [currentWord setHighlighted:NO];
    } else {
        [currentWord setHighlighted:YES];

        [thisLabel setHighlighted:NO];
        [isLabel setHighlighted:NO];
        [aLabel setHighlighted:NO];
    }
}

ハイライトされたテキストの色が他の場所でオレンジ色に設定されています。これは最初の試みと同じ効果がありました。

最近、この関数を連続して呼び出してみました。

- (void)readSection:(NSString *)section
{
    [self playSound:section];
    [self shiftHighlight:section];
}

私もNSTimersで何かを試しましたが、それは非常に混乱し、間違った木をNSTimersで吠えているように見えました。

ビヘイビアはすべてのラベルで有効になっています。

ですから、誰かが私のための解決策を持っているか、この問題にNSTimersを使用する方法を注意深く説明できるなら、私は彼女にとても感謝しています。

4

1 に答える 1

1

いずれの場合も、ステートメントはサウンドの再生が終了するのを待たずに、発生順に事前に実行されます。最後に実行されるステートメントが最終結果になります。つまり、最後のラベルが強調表示されます。
playSoundメソッドに、完了後に実行されるコールバックブロックまたはデリゲート関数を渡す方法がある場合は、ハイライトラベルにロジックを書き込むか、次のサウンドを再生する必要があります。

于 2013-02-24T17:42:54.073 に答える