0

我只在程序中包含了与此标签相关的代码。

在我的 viewDidLoad 方法中,我有

[startLabel setHidden:NO];
startLabel.text = @"Touch to Begin";

然后在 touchesBegan 方法中

startLabel.text = @"Loading . .";
[self fillArrays];

然后在填充数组方法中填充数组,然后隐藏标签 -

 self.myArray = [NSArray arrayWithObjects:
             [UIImage imageNamed:@"Frame 1.png"], . .etc etc etc . . . nil]];

 [startLabel setHidden:YES];

但是,在加载 Array 之前不会更新文本。导致“正在加载...”文本从未出现。因为它似乎是在填充数组后实现的。

同时 setHidden bool 设置为 YES,因此永远不会看到标签。

我希望 startLabel 在方法开始填充数组之前更新,因为这需要一些时间。即顺序操作的方法。

这可能吗?

谢谢你

4

2 回答 2

1

你不需要多线程,那太复杂了。问题是,在您的代码返回之前,UIKit 不会更新用户界面,因此您要安排用户界面更新,加载数组,然后将控制权返回给 UIKit,然后由 UIKit 执行用户界面更新。您需要做的是安排用户界面更新,将控制权返回给 UIKit,然后在运行循环的下一次迭代中加载数组。为此,您可以使用performSelector:withObject:afterDelay:零延迟,它在下一次运行循环迭代中执行方法调用。这应该可以解决问题:

startLabel.text = @"Loading . .";
[self performSelector:@selector(fillArrays) withObject:nil afterDelay:0];
于 2012-08-21T11:27:47.123 回答
0

您需要将数组加载到与 GUI 更新不同的线程上。

见这篇文章:http ://evilrockhopper.com/2010/01/iphone-development-keeping-the-ui-responsive-and-a-background-thread-pattern/

您想要的功能是performSelectorInBackground

这样,您的 UI 更新和后台工作可以同时完成。

您可以运行另一个函数,它也以类似的方式更新主线程上的标签:

performSelectorOnMainThread

这样你就可以在后台加载数组,然后在主线程上更新你的 UI(这很好,因为我认为 UIKit 不是线程安全的。

于 2012-08-21T10:49:49.483 回答