我想在for
循环中操作视图。我在循环中操作视图for
,然后在for
循环结束后立即完成视图的操作。我尝试使用 GCD 等其他线程,但我注意到主线程中有一个视图。操作返回到主线程,并在for
循环结束后被推迟。
我想要做的是在for
循环中更新 UITextView 的文本。如果我不能for
在另一个线程中操作循环,我该怎么做?还有其他方法可以做到这一点吗?
我想在for
循环中操作视图。我在循环中操作视图for
,然后在for
循环结束后立即完成视图的操作。我尝试使用 GCD 等其他线程,但我注意到主线程中有一个视图。操作返回到主线程,并在for
循环结束后被推迟。
我想要做的是在for
循环中更新 UITextView 的文本。如果我不能for
在另一个线程中操作循环,我该怎么做?还有其他方法可以做到这一点吗?
解决方案 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];
}
});
}