如何在for循环中操作视图

时间:2012-09-13 17:33:48

标签: objective-c view for-loop nsthread

我想在for循环中操纵视图。我操纵for循环中的视图,然后在for循环结束后立即完成视图的操作。我试图使用其他线程,如GCD,但我注意到一个视图在主线程中。操作返回到主线程,并在for循环结束后将其关闭。

我想要做的是在for循环中更新UITextView的文本。如果我无法在另一个线程中操作for循环,我该怎么办呢?还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

解决方案1:使用计时器

为了逐步将文本添加到textview,您可以使用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,如果在类级别不存在的话。然后,您可以使用addTextToTextViewsender.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];
                       }
                   });


}