0

我想在for循环中操作视图。我在循环中操作视图for,然后在for循环结束后立即完成视图的操作。我尝试使用 GCD 等其他线程,但我注意到主线程中有一个视图。操作返回到主线程,并在for循环结束后被推迟。

我想要做的是在for循环中更新 UITextView 的文本。如果我不能for在另一个线程中操作循环,我该怎么做?还有其他方法可以做到这一点吗?

4

1 回答 1

1

解决方案 1:使用计时器

为了逐步将文本添加到文本视图,您可以使用 NSTimer。

要求

在您的界面中 - 以下 ivars 或属性:

UITextView *textView;

NSNumber *currentIndex;

NSTimer *timer;

NSString *stringForTextView;

假设创建了字符串并设置了 textview,您可以创建一个函数来创建计时器并将其启动:

- (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. 您还可以调整计时器间隔以及添加文本的准确方式。我以半秒和逐字符连接为例。


解决方案 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 回答