如何创建可重复使用的载入画面?

时间:2009-05-07 14:57:12

标签: iphone

如何创建可在任何给定时间重复使用的加载屏幕。我知道Default.png但我需要灵活地在应用程序生命周期的任何时候插入加载屏幕。

这就是我到目前为止所做的。

//inside a method that gets called by a UIButton

LoadingViewController* loadController = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil vertical:NO];
[self.view addSubview: loadController.view];

//some method call that takes a few seconds to execute
[self doSomething];

//This loads some other view, my final view
[self.view addSubview: someOtherView]

但似乎永远不会显示加载视图。相反,之前的视图会保留,直到添加“someOtherView”。我把跟踪日志和代码似乎确实执行了,我甚至用sleep(2)替换了[self doSomething],但是从不显示中间加载视图。

如果我删除[self.view addSubview:someOtherView];然后几秒钟后......(在doSomething完成执行之后)显示加载视图,因为没有被推到它上面的视图,但这显然不是我想要的功能。

可以解释一下这种行为吗?有什么关于渲染周期我误解,因为它看起来不像(至少在屏幕上)视图立即更新,即使我调用[self.view addSubview:loadController.view];

我需要创建一个单独的线程吗?

2 个答案:

答案 0 :(得分:4)

通常,要使UI的更改对用户可见,控件必须返回到主runLoop。在将加载视图下移并将其替换为其他视图后,您只返回runLoop。处理此问题的一种策略是将执行加载的代码移动到另一个线程上。 NSOperation和NSOperationQueue可以用于此目的。

更简单的方法是使用performSelectorInBackground:withObject来进行处理。处理完成后,可以再次更新UI以显示数据。重要的是要记住UI更新必须在主线程上执行。使用performSelectorOnMainThread:withObject:waitUntilDone:从加载线程完成此操作。

这听起来很复杂,但它真的很简单,就像将单个方法分解为三个不同的方法一样简单:

  • 显示加载视图并启动后台进程 - 这是按钮操作方法。
  • 执行后台加载 - 使用performSelectorInBackground:withObject从按钮操作函数调用。
  • 删除加载视图并使用数据更新显示 - 使用performSelectorOnMainThread:withObject:waitUntilDone从后台线程调用。

答案 1 :(得分:1)

我创建了一个UIView的子类,我初始化了我的加载视图应该如何工作和看起来像。 (我的视图出现并从底部滑入一个漂亮的动画)。

然后我添加了代码来处理UIViewController的子类中是否应该加载视图。

然后我让所有的viewcontrollers都成为我的新viewcontroller类的子类,这使我可以这样做:

[self showloadingMessage:@"loading..."];

在我的所有viewcontrollers中......