0

forループ中にビューを操作したい。ループ内でビューを操作すると、ループ終了for後に一気にビューの操作が行われforます。GCD などの他のスレッドを使用しようとしましたが、ビューがメイン スレッドにあることに気付きました。操作はメイン スレッドに戻り、forループの終了後に延期されます。

私がやりたいことは、forループ中に UITextView のテキストを更新することです。for別のスレッドでループを操作できない場合、どうすればそれを行うことができますか? それを行う他の方法はありますか?

4

1 に答える 1

1

解決策 1: タイマーを使用する

テキストビューにテキストを徐々に追加するには、NSTimer を使用できます。

要件

インターフェイスで - 次の ivar またはプロパティ:

UITextView *textView;

NSNumber *currentIndex;

NSTimer *timer;

NSString *stringForTextView;

文字列が作成され、テキストビューが設定されていると仮定すると、タイマーを作成して開始する関数を作成できます。

- (void) updateTextViewButtonPressed
{


   timer = [NSTimer scheduledTimerWithTimeInterval:.5
                                     target:self
                                   selector:@selector(addTextToTextView)
                                   userInfo:nil
                                    repeats:YES];


}

- (void) addTextToTextView
{
    textView.text = [string substringToIndex:currentIndex.integerValue];
    currentIndex = [NSNumber numberWithInt:currentIndex.integerValue + 1];

    if(currentIndex.integerValue == string.length)
    {
        [_timer invalidate];
        timer = nil;
    }
}

これは基本的な実装であり、タイマーの userInfo として文字列を渡すように変更できます (クラス レベルに存在しない場合)。addTextToTextView次に、セレクターで を使用してアクセスできますsender.userInfo。タイマーの間隔と、テキストが追加される正確さを調整することもできます。例として、0.5 秒と文字ごとの連結を使用しました。


解決策 2: ループを使用する

要件

NSString *string

UITextview *textView

- (void) updateTextViewButtonPressed
{
    // perform the actual loop on a background thread, so UI isn't blocked
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^()
                   {
                       for (int i = 0; i < string.length; i++)
                       {
                           // use main thread to update view
                           dispatch_async(dispatch_get_main_queue(), ^()
                                          {
                                              textView.text = [string substringToIndex:i];

                                          });

                           // delay
                           [NSThread sleepForTimeInterval:.5];
                       }
                   });


}
于 2012-09-13T17:42:16.933 に答える