我想在for
循环中操纵视图。我操纵for
循环中的视图,然后在for
循环结束后立即完成视图的操作。我试图使用其他线程,如GCD,但我注意到一个视图在主线程中。操作返回到主线程,并在for
循环结束后将其关闭。
我想要做的是在for
循环中更新UITextView的文本。如果我无法在另一个线程中操作for
循环,我该怎么办呢?还有其他方法吗?
答案 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,如果在类级别不存在的话。然后,您可以使用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];
}
});
}